cds
2.3.2
|
Lazy free-list based on bounded lock-free queue cds::intrusive::VyukovMPMCCycleQueue
.
More...
#include <cds/memory/vyukov_queue_pool.h>
Public Types | |
typedef cds::intrusive::VyukovMPMCCycleQueue< T, Traits > | queue_type |
Queue type. | |
typedef T | value_type |
Value type. | |
typedef Traits | traits |
Pool traits. | |
typedef traits::allocator::template rebind< value_type >::other | allocator_type |
allocator type | |
Public Member Functions | |
lazy_vyukov_queue_pool (size_t nCapacity=0) | |
Constructs empty pool. | |
~lazy_vyukov_queue_pool () | |
Deallocates all objects from the pool. | |
value_type * | allocate (size_t n) |
Allocates an object from pool. More... | |
void | deallocate (value_type *p, size_t n) |
Deallocates the object p . More... | |
Lazy free-list based on bounded lock-free queue cds::intrusive::VyukovMPMCCycleQueue
.
Template parameters:
T
- the type of object maintaining by free-list. T
must be default constructibleTraits
- traits for cds::intrusive::VyukovMPMCCycleQueue
class plus cds::opt::allocator
option, default is vyukov_queue_pool_traits
Internals
This free-list is very simple. At construction time the pool is empty. When allocating the free-list tries to pop an object from internal queue. If success the popped object is returned. Otherwise a new one is allocated. When deallocating, the free-list tries to push the object into the pool. If internal queue is full, the object is deallocated by using the allocator provided. The pool can manage more than N
items but only N
items is placed in the free-list.
Usage
lazy_vyukov_queue_pool
should be used together with pool_allocator. You should declare an static object of type lazy_vyukov_queue_pool
, provide an accessor functor to this object and use pool_allocator
as an allocator:
|
inline |
Allocates an object from pool.
The pool supports allocation only single object (n
= 1). If n
> 1 the behavior is undefined.
If the queue is not empty, the popped value is returned. Otherwise, a new value allocated.
|
inline |
Deallocates the object p
.
The pool supports allocation only single object (n
= 1). If n
> 1 the behaviour is undefined.
If the queue is not full, p
is pushed into the queue. Otherwise, p
is deallocated by allocator provided.