glider/common/pool/buffer.go

44 lines
752 B
Go
Raw Normal View History

2020-04-19 17:03:39 +08:00
package pool
import (
"sync"
)
2020-08-06 18:07:20 +08:00
const num = 17 // number of pools, pool size range: 1<<0 ~ 1<<16 bytes. (1Byte~64KBytes)
2020-04-19 17:03:39 +08:00
2020-08-06 18:07:20 +08:00
var (
pools [num]sync.Pool
sizes [num]int
)
2020-08-06 18:07:20 +08:00
func init() {
// use range here to get a copy of index(different k) in each loop.
for k := range pools {
2020-08-06 18:07:20 +08:00
sizes[k] = 1 << k
pools[k].New = func() interface{} {
return make([]byte, sizes[k])
}
}
2020-04-19 17:03:39 +08:00
}
2020-08-06 18:07:20 +08:00
// GetBuffer gets a buffer from pool.
2020-04-19 23:20:15 +08:00
func GetBuffer(size int) []byte {
2020-08-06 18:07:20 +08:00
for i := 0; i < num; i++ {
if size <= sizes[i] {
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) {
c := cap(buf)
for i := 0; i < num; i++ {
if c == sizes[i] {
pools[i].Put(buf)
2020-04-19 17:03:39 +08:00
return
}
}
}