| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 | package bytespoolimport "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		}	}}
 |