2019-02-16 06:31:24 +03:00
|
|
|
package pool
|
|
|
|
|
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/lightningnetwork/lnd/buffer"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
// DefaultWriteBufferGCInterval is the default interval that a Write
|
|
|
|
// will perform a sweep to see which expired buffer.Writes can be
|
|
|
|
// released to the runtime.
|
|
|
|
DefaultWriteBufferGCInterval = 15 * time.Second
|
|
|
|
|
|
|
|
// DefaultWriteBufferExpiryInterval is the default, minimum interval
|
2020-11-26 04:47:01 +03:00
|
|
|
// that must elapse before a Write will release a buffer.Write. The
|
2019-02-16 06:31:24 +03:00
|
|
|
// maximum time before the buffer can be released is equal to the expiry
|
|
|
|
// interval plus the gc interval.
|
|
|
|
DefaultWriteBufferExpiryInterval = 30 * time.Second
|
|
|
|
)
|
|
|
|
|
|
|
|
// WriteBuffer is a pool of recycled buffer.Write items, that dynamically
|
|
|
|
// allocates and reclaims buffers in response to load.
|
|
|
|
type WriteBuffer struct {
|
|
|
|
pool *Recycle
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewWriteBuffer returns a freshly instantiated WriteBuffer, using the given
|
|
|
|
// gcInterval and expiryIntervals.
|
|
|
|
func NewWriteBuffer(gcInterval, expiryInterval time.Duration) *WriteBuffer {
|
|
|
|
return &WriteBuffer{
|
|
|
|
pool: NewRecycle(
|
|
|
|
func() interface{} { return new(buffer.Write) },
|
|
|
|
100, gcInterval, expiryInterval,
|
|
|
|
),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Take returns a fresh buffer.Write to the caller.
|
|
|
|
func (p *WriteBuffer) Take() *buffer.Write {
|
|
|
|
return p.pool.Take().(*buffer.Write)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return returns the buffer.Write to the pool, so that it can be recycled or
|
|
|
|
// released.
|
|
|
|
func (p *WriteBuffer) Return(buf *buffer.Write) {
|
|
|
|
p.pool.Return(buf)
|
|
|
|
}
|