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  }