- \p opt::value_cleaner - a functor to clean item dequeued.
The functor calls the destructor for queue item.
After an item is dequeued, \p value_cleaner cleans the cell that the item has been occupied.
- If \p T is a complex type, \p value_cleaner may be the useful feature.
+ If \p T is a complex type, \p value_cleaner can be an useful feature.
Default value is \ref opt::v::destruct_cleaner
- \p opt::item_counter - the type of item counting feature. Default is \p cds::atomicity::empty_item_counter (item counting disabled)
To enable item counting use \p cds::atomicity::item_counter
/// Constructs the queue of capacity \p nCapacity
/**
For \p cds::opt::v::static_buffer the \p nCapacity parameter is ignored.
+
+ The buffer capacity must be the power of two.
*/
VyukovMPMCCycleQueue(
size_t nCapacity = 0
// Buffer capacity must be power of 2
assert( nCapacity >= 2 && (nCapacity & (nCapacity - 1)) == 0 );
- for (size_t i = 0; i != nCapacity; i += 1)
+ for (size_t i = 0; i != nCapacity; ++i )
m_buffer[i].sequence.store(i, memory_model::memory_order_relaxed);
m_posEnqueue.store(0, memory_model::memory_order_relaxed);
intptr_t dif = static_cast<intptr_t>(seq) - static_cast<intptr_t>(pos);
- if (dif == 0)
- {
- if ( m_posEnqueue.compare_exchange_weak(pos, pos + 1, memory_model::memory_order_relaxed))
+ if (dif == 0) {
+ if ( m_posEnqueue.compare_exchange_weak(pos, pos + 1, memory_model::memory_order_relaxed, atomics::memory_order_relaxed ))
break;
}
else if (dif < 0)
intptr_t dif = static_cast<intptr_t>(seq) - static_cast<intptr_t>(pos);
- if (dif == 0)
- {
- if ( m_posEnqueue.compare_exchange_weak(pos, pos + 1, memory_model::memory_order_relaxed) )
+ if (dif == 0) {
+ if ( m_posEnqueue.compare_exchange_weak(pos, pos + 1, memory_model::memory_order_relaxed, atomics::memory_order_relaxed))
break;
}
else if (dif < 0)
intptr_t dif = static_cast<intptr_t>(seq) - static_cast<intptr_t>(pos + 1);
if (dif == 0) {
- if ( m_posDequeue.compare_exchange_weak(pos, pos + 1, memory_model::memory_order_relaxed))
+ if ( m_posDequeue.compare_exchange_weak(pos, pos + 1, memory_model::memory_order_relaxed, atomics::memory_order_relaxed))
break;
}
else if (dif < 0)
f( cell->data );
value_cleaner()( cell->data );
- --m_ItemCounter;
cell->sequence.store( pos + m_nBufferMask + 1, memory_model::memory_order_release );
+ --m_ItemCounter;
return true;
}
/// Returns queue's item count
/**
The value returned depends on \p vyukov_queue::traits::item_counter option.
- For \p atomicity::empty_item_counter, this function always returns 0.
+ For \p atomicity::empty_item_counter, the function always returns 0.
*/
size_t size() const
{