| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- package buf
- import (
- "sync"
- )
- // Pool provides functionality to generate and recycle buffers on demand.
- type Pool interface {
- // Allocate either returns a unused buffer from the pool, or generates a new one from system.
- Allocate() *Buffer
- // Free recycles the given buffer.
- Free(*Buffer)
- }
- // SyncPool is a buffer pool based on sync.Pool
- type SyncPool struct {
- allocator *sync.Pool
- }
- // NewSyncPool creates a SyncPool with given buffer size.
- func NewSyncPool(bufferSize uint32) *SyncPool {
- pool := &SyncPool{
- allocator: &sync.Pool{
- New: func() interface{} { return make([]byte, bufferSize) },
- },
- }
- return pool
- }
- // Allocate implements Pool.Allocate().
- func (p *SyncPool) Allocate() *Buffer {
- return &Buffer{
- v: p.allocator.Get().([]byte),
- pool: p,
- }
- }
- // Free implements Pool.Free().
- func (p *SyncPool) Free(buffer *Buffer) {
- if buffer.v != nil {
- p.allocator.Put(buffer.v)
- }
- }
- const (
- // Size of a regular buffer.
- Size = 2 * 1024
- )
- var (
- mediumPool Pool = NewSyncPool(Size)
- )
|