| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- package bytespool
- import "sync"
- func createAllocFunc(size int32) func() interface{} {
- return func() interface{} {
- return make([]byte, size)
- }
- }
- // The following parameters controls the size of buffer pools.
- // There are numPools pools. Starting from 2k size, the size of each pool is sizeMulti of the previous one.
- // Package buf is guaranteed to not use buffers larger than the largest pool.
- // Other packets may use larger buffers.
- const (
- numPools = 4
- sizeMulti = 4
- )
- var (
- pool [numPools]sync.Pool
- poolSize [numPools]int32
- )
- func init() {
- size := int32(2048)
- for i := 0; i < numPools; i++ {
- pool[i] = sync.Pool{
- New: createAllocFunc(size),
- }
- poolSize[i] = size
- size *= sizeMulti
- }
- }
- // Alloc returns a byte slice with at least the given size. Minimum size of returned slice is 2048.
- func Alloc(size int32) []byte {
- for idx, ps := range poolSize {
- if size <= ps {
- return pool[idx].Get().([]byte)
- }
- }
- return make([]byte, size)
- }
- // Free puts a byte slice into the internal pool.
- func Free(b []byte) {
- size := int32(cap(b))
- b = b[0:cap(b)]
- for i := numPools - 1; i >= 0; i-- {
- if size >= poolSize[i] {
- pool[i].Put(b) // nolint: megacheck
- return
- }
- }
- }
|