github.com/cilium/ebpf@v0.16.0/internal/buffer.go (about) 1 package internal 2 3 import ( 4 "bytes" 5 "sync" 6 ) 7 8 var bytesBufferPool = sync.Pool{ 9 New: func() interface{} { 10 return new(bytes.Buffer) 11 }, 12 } 13 14 // NewBuffer retrieves a [bytes.Buffer] from a pool an re-initialises it. 15 // 16 // The returned buffer should be passed to [PutBuffer]. 17 func NewBuffer(buf []byte) *bytes.Buffer { 18 wr := bytesBufferPool.Get().(*bytes.Buffer) 19 // Reinitialize the Buffer with a new backing slice since it is returned to 20 // the caller by wr.Bytes() below. Pooling is faster despite calling 21 // NewBuffer. The pooled alloc is still reused, it only needs to be zeroed. 22 *wr = *bytes.NewBuffer(buf) 23 return wr 24 } 25 26 // PutBuffer releases a buffer to the pool. 27 func PutBuffer(buf *bytes.Buffer) { 28 // Release reference to the backing buffer. 29 *buf = *bytes.NewBuffer(nil) 30 bytesBufferPool.Put(buf) 31 }