You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.5 KiB
52 lines
1.5 KiB
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) |
|
}
|
|
|