github.com/decred/dcrlnd@v0.7.6/pool/read_buffer.go (about) 1 package pool 2 3 import ( 4 "time" 5 6 "github.com/decred/dcrlnd/buffer" 7 ) 8 9 const ( 10 // DefaultReadBufferGCInterval is the default interval that a Read will 11 // perform a sweep to see which expired buffer.Reads can be released to 12 // the runtime. 13 DefaultReadBufferGCInterval = 15 * time.Second 14 15 // DefaultReadBufferExpiryInterval is the default, minimum interval that 16 // must elapse before a Read will release a buffer.Read. The maximum 17 // time before the buffer can be released is equal to the expiry 18 // interval plus the gc interval. 19 DefaultReadBufferExpiryInterval = 30 * time.Second 20 ) 21 22 // ReadBuffer is a pool of buffer.Read items, that dynamically allocates and 23 // reclaims buffers in response to load. 24 type ReadBuffer struct { 25 pool *Recycle 26 } 27 28 // NewReadBuffer returns a freshly instantiated ReadBuffer, using the given 29 // gcInterval and expiryInterval. 30 func NewReadBuffer(gcInterval, expiryInterval time.Duration) *ReadBuffer { 31 return &ReadBuffer{ 32 pool: NewRecycle( 33 func() interface{} { return new(buffer.Read) }, 34 100, gcInterval, expiryInterval, 35 ), 36 } 37 } 38 39 // Take returns a fresh buffer.Read to the caller. 40 func (p *ReadBuffer) Take() *buffer.Read { 41 return p.pool.Take().(*buffer.Read) 42 } 43 44 // Return returns the buffer.Read to the pool, so that it can be cycled or 45 // released. 46 func (p *ReadBuffer) Return(buf *buffer.Read) { 47 p.pool.Return(buf) 48 }