gost/pkg/internal/bufpool/pool.go
2021-11-01 21:57:28 +08:00

101 lines
1.5 KiB
Go

package bufpool
import "sync"
var (
smallBufferSize = 1 * 1024 // 1KB buffer
mediumBufferSize = 8 * 1024 // 8KB buffer
largeBufferSize = 64 * 1024 // 64KB buffer
)
var (
pools = []struct {
size int
pool sync.Pool
}{
{
size: 128,
pool: sync.Pool{
New: func() interface{} {
return make([]byte, 128)
},
},
},
{
size: 512,
pool: sync.Pool{
New: func() interface{} {
return make([]byte, 512)
},
},
},
{
size: 1024,
pool: sync.Pool{
New: func() interface{} {
return make([]byte, 1024)
},
},
},
{
size: 4096,
pool: sync.Pool{
New: func() interface{} {
return make([]byte, 4096)
},
},
},
{
size: 8192,
pool: sync.Pool{
New: func() interface{} {
return make([]byte, 8192)
},
},
},
{
size: 16 * 1024,
pool: sync.Pool{
New: func() interface{} {
return make([]byte, 16*1024)
},
},
},
{
size: 32 * 1024,
pool: sync.Pool{
New: func() interface{} {
return make([]byte, 32*1024)
},
},
},
{
size: 64 * 1024,
pool: sync.Pool{
New: func() interface{} {
return make([]byte, 64*1024)
},
},
},
}
)
// Get returns a buffer size range from (0, 64]KB,
// panic if size > 64KB.
func Get(size int) []byte {
for i := range pools {
if size <= pools[i].size {
return pools[i].pool.Get().([]byte)
}
}
panic("size too large (max=64KB)")
}
func Put(b []byte) {
for i := range pools {
if len(b) == pools[i].size {
pools[i].pool.Put(b)
}
}
}