53 lines
1.5 KiB
Go
53 lines
1.5 KiB
Go
|
package pool
|
||
|
|
||
|
import (
|
||
|
"time"
|
||
|
|
||
|
"github.com/lightningnetwork/lnd/queue"
|
||
|
)
|
||
|
|
||
|
// Recycler is an interface that allows an object to be reclaimed without
|
||
|
// needing to be returned to the runtime.
|
||
|
type Recycler interface {
|
||
|
// Recycle resets the object to its default state.
|
||
|
Recycle()
|
||
|
}
|
||
|
|
||
|
// Recycle is a generic queue for recycling objects implementing the Recycler
|
||
|
// interface. It is backed by an underlying queue.GCQueue, and invokes the
|
||
|
// Recycle method on returned objects before returning them to the queue.
|
||
|
type Recycle struct {
|
||
|
queue *queue.GCQueue
|
||
|
}
|
||
|
|
||
|
// NewRecycle initializes a fresh Recycle instance.
|
||
|
func NewRecycle(newItem func() interface{}, returnQueueSize int,
|
||
|
gcInterval, expiryInterval time.Duration) *Recycle {
|
||
|
|
||
|
return &Recycle{
|
||
|
queue: queue.NewGCQueue(
|
||
|
newItem, returnQueueSize,
|
||
|
gcInterval, expiryInterval,
|
||
|
),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Take returns an element from the pool.
|
||
|
func (r *Recycle) Take() interface{} {
|
||
|
return r.queue.Take()
|
||
|
}
|
||
|
|
||
|
// Return returns an item implementing the Recycler interface to the pool. The
|
||
|
// Recycle method is invoked before returning the item to improve performance
|
||
|
// and utilization under load.
|
||
|
func (r *Recycle) Return(item Recycler) {
|
||
|
// Recycle the item to ensure that a dirty instance is never offered
|
||
|
// from Take. The call is done here so that the CPU cycles spent
|
||
|
// clearing the buffer are owned by the caller, and not by the queue
|
||
|
// itself. This makes the queue more likely to be available to deliver
|
||
|
// items in the free list.
|
||
|
item.Recycle()
|
||
|
|
||
|
r.queue.Return(item)
|
||
|
}
|