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-04-21 12:17:14 +08:00
|
|
|
|
2020-08-06 18:07:20 +08:00
|
|
|
func init() {
|
|
|
|
// use range here to get a copy of index(different k) in each loop.
|
2020-04-21 12:17:14 +08:00
|
|
|
for k := range pools {
|
2020-08-06 18:07:20 +08:00
|
|
|
sizes[k] = 1 << k
|
2020-04-21 12:17:14 +08:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2020-05-02 21:49:30 +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
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|