glider/pkg/pool/buffer.go

51 lines
884 B
Go
Raw Normal View History

2020-04-19 17:03:39 +08:00
package pool
import (
"math/bits"
2020-04-19 17:03:39 +08:00
"sync"
)
const (
// number of pools.
2020-08-10 18:43:41 +08:00
num = 17
maxsize = 1 << (num - 1)
)
2020-04-19 17:03:39 +08:00
2020-08-06 18:07:20 +08:00
var (
sizes [num]int
pools [num]sync.Pool
2020-08-06 18:07:20 +08:00
)
2020-08-06 18:07:20 +08:00
func init() {
for i := 0; i < num; i++ {
size := 1 << i
sizes[i] = size
pools[i].New = func() interface{} {
return make([]byte, size)
}
}
2020-04-19 17:03:39 +08:00
}
2020-08-10 18:43:41 +08:00
// GetBuffer gets a buffer from pool, size should in range: [1, 65536],
// otherwise, this function will call make([]byte, size) directly.
2020-04-19 23:20:15 +08:00
func GetBuffer(size int) []byte {
2020-08-10 18:43:41 +08:00
if size >= 1 && size <= maxsize {
i := bits.Len32(uint32(size)) - 1
if sizes[i] < size {
i += 1
}
return pools[i].Get().([]byte)[:size]
2020-04-19 17:03:39 +08:00
}
2020-08-06 18:07:20 +08:00
return make([]byte, size)
2020-04-19 17:03:39 +08:00
}
// PutBuffer puts a buffer into pool.
2020-08-06 18:07:20 +08:00
func PutBuffer(buf []byte) {
2020-08-23 23:23:30 +08:00
if size := cap(buf); size >= 1 && size <= maxsize {
i := bits.Len32(uint32(size)) - 1
if sizes[i] == size {
pools[i].Put(buf)
}
2020-04-19 17:03:39 +08:00
}
}