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