mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-03 22:45:13 +08:00
新增异步日志功能
This commit is contained in:
89
util/bytespool/bytespool.go
Normal file
89
util/bytespool/bytespool.go
Normal file
@@ -0,0 +1,89 @@
|
||||
package bytespool
|
||||
|
||||
import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
type IBytesMempool interface {
|
||||
MakeBytes(size int) []byte
|
||||
ReleaseBytes(byteBuff []byte) bool
|
||||
}
|
||||
|
||||
type memAreaPool struct {
|
||||
minAreaValue int //最小范围值
|
||||
maxAreaValue int //最大范围值
|
||||
growthValue int //内存增长值
|
||||
pool []sync.Pool
|
||||
}
|
||||
|
||||
var memAreaPoolList = [4]*memAreaPool{&memAreaPool{minAreaValue: 1, maxAreaValue: 4096, growthValue: 512}, &memAreaPool{minAreaValue: 4097, maxAreaValue: 40960, growthValue: 4096}, &memAreaPool{minAreaValue: 40961, maxAreaValue: 417792, growthValue: 16384}, &memAreaPool{minAreaValue: 417793, maxAreaValue: 1925120, growthValue: 65536}}
|
||||
|
||||
func init() {
|
||||
for i := 0; i < len(memAreaPoolList); i++ {
|
||||
memAreaPoolList[i].makePool()
|
||||
}
|
||||
}
|
||||
|
||||
func NewMemAreaPool() *memAreaPool {
|
||||
return &memAreaPool{}
|
||||
}
|
||||
|
||||
func (areaPool *memAreaPool) makePool() {
|
||||
poolLen := (areaPool.maxAreaValue - areaPool.minAreaValue + 1) / areaPool.growthValue
|
||||
areaPool.pool = make([]sync.Pool, poolLen)
|
||||
for i := 0; i < poolLen; i++ {
|
||||
memSize := (areaPool.minAreaValue - 1) + (i+1)*areaPool.growthValue
|
||||
areaPool.pool[i] = sync.Pool{New: func() interface{} {
|
||||
return make([]byte, memSize)
|
||||
}}
|
||||
}
|
||||
}
|
||||
|
||||
func (areaPool *memAreaPool) makeByteSlice(size int) []byte {
|
||||
pos := areaPool.getPosByteSize(size)
|
||||
if pos > len(areaPool.pool) || pos == -1 {
|
||||
return nil
|
||||
}
|
||||
|
||||
return areaPool.pool[pos].Get().([]byte)[:size]
|
||||
}
|
||||
|
||||
func (areaPool *memAreaPool) getPosByteSize(size int) int {
|
||||
pos := (size - areaPool.minAreaValue) / areaPool.growthValue
|
||||
if pos >= len(areaPool.pool) {
|
||||
return -1
|
||||
}
|
||||
|
||||
return pos
|
||||
}
|
||||
|
||||
func (areaPool *memAreaPool) releaseByteSlice(byteBuff []byte) bool {
|
||||
pos := areaPool.getPosByteSize(cap(byteBuff))
|
||||
if pos > len(areaPool.pool) || pos == -1 {
|
||||
panic("assert!")
|
||||
return false
|
||||
}
|
||||
|
||||
areaPool.pool[pos].Put(byteBuff)
|
||||
return true
|
||||
}
|
||||
|
||||
func (areaPool *memAreaPool) MakeBytes(size int) []byte {
|
||||
for i := 0; i < len(memAreaPoolList); i++ {
|
||||
if size <= memAreaPoolList[i].maxAreaValue {
|
||||
return memAreaPoolList[i].makeByteSlice(size)
|
||||
}
|
||||
}
|
||||
|
||||
return make([]byte, size)
|
||||
}
|
||||
|
||||
func (areaPool *memAreaPool) ReleaseBytes(byteBuff []byte) bool {
|
||||
for i := 0; i < len(memAreaPoolList); i++ {
|
||||
if cap(byteBuff) <= memAreaPoolList[i].maxAreaValue {
|
||||
return memAreaPoolList[i].releaseByteSlice(byteBuff)
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
@@ -42,9 +42,9 @@ func Abs[NumType SignedNumberType](Num NumType) NumType {
|
||||
func Add[NumType NumberType](number1 NumType, number2 NumType) NumType {
|
||||
ret := number1 + number2
|
||||
if number2> 0 && ret < number1 {
|
||||
log.SStack("Calculation overflow , number1 is ",number1," number2 is ",number2)
|
||||
log.Stack("Calculation overflow" ,log.Any("number1",number1),log.Any("number2",number2))
|
||||
}else if (number2<0 && ret > number1){
|
||||
log.SStack("Calculation overflow , number1 is ",number1," number2 is ",number2)
|
||||
log.Stack("Calculation overflow" ,log.Any("number1",number1),log.Any("number2",number2))
|
||||
}
|
||||
|
||||
return ret
|
||||
@@ -53,9 +53,9 @@ func Add[NumType NumberType](number1 NumType, number2 NumType) NumType {
|
||||
func Sub[NumType NumberType](number1 NumType, number2 NumType) NumType {
|
||||
ret := number1 - number2
|
||||
if number2> 0 && ret > number1 {
|
||||
log.SStack("Calculation overflow , number1 is ",number1," number2 is ",number2)
|
||||
log.Stack("Calculation overflow" ,log.Any("number1",number1),log.Any("number2",number2))
|
||||
}else if (number2<0 && ret < number1){
|
||||
log.SStack("Calculation overflow , number1 is ",number1," number2 is ",number2)
|
||||
log.Stack("Calculation overflow" ,log.Any("number1",number1),log.Any("number2",number2))
|
||||
}
|
||||
|
||||
return ret
|
||||
@@ -71,8 +71,8 @@ func Mul[NumType NumberType](number1 NumType, number2 NumType) NumType {
|
||||
if ret / number2 == number1 {
|
||||
return ret
|
||||
}
|
||||
|
||||
log.SStack("Calculation overflow , number1 is ",number1," number2 is ",number2)
|
||||
|
||||
log.Stack("Calculation overflow" ,log.Any("number1",number1),log.Any("number2",number2))
|
||||
return ret
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user