//@endcond
};
- class monotonic_counter
- {
- public:
- typedef size_t counter_type;
-
- monotonic_counter()
- : m_nCounter(0)
- {}
-
- size_t inc()
- {
- return ++m_nCounter;
- }
-
- size_t dec()
- {
- return m_nCounter--;
- }
-
- size_t value() const
- {
- return m_nCounter;
- }
-
- private:
- size_t m_nCounter;
- };
-
/// MSPriorityQueue traits
struct traits {
/// Storage type
or any other with interface like \p %mspriority_queue::stat
*/
typedef empty_stat stat;
-
- /// Item counter type
- typedef cds::bitop::bit_reverse_counter<> item_counter;
-
- /// Fairness
- static bool const fairness = true;
};
/// Metafunction converting option list to traits
typedef typename opt::details::make_comparator< value_type, traits >::type key_comparator;
# endif
- typedef typename traits::lock_type lock_type; ///< heap's size lock type
- typedef typename traits::back_off back_off; ///< Back-off strategy
- typedef typename traits::stat stat; ///< internal statistics type
+ typedef typename traits::lock_type lock_type; ///< heap's size lock type
+ typedef typename traits::back_off back_off; ///< Back-off strategy
+ typedef typename traits::stat stat; ///< internal statistics type, see \p mspriority_queue::traits::stat
+ typedef typename cds::bitop::bit_reverse_counter<> item_counter;///< Item counter type
protected:
//@cond
typedef typename traits::buffer::template rebind<node>::other buffer_type ; ///< Heap array buffer type
//@cond
- typedef typename traits::item_counter item_counter_type;
- typedef typename item_counter_type::counter_type counter_type;
+ typedef typename item_counter::counter_type counter_type;
//@endcond
- static const bool c_bFairQueue = traits::fairness;
-
protected:
- item_counter_type m_ItemCounter ; ///< Item counter
+ item_counter m_ItemCounter ; ///< Item counter
mutable lock_type m_Lock ; ///< Heap's size lock
buffer_type m_Heap ; ///< Heap array
stat m_Stat ; ///< internal statistics accumulator
assert( nBottom < m_Heap.capacity() );
assert( nBottom > 0 );
- if ( c_bFairQueue ) {
- refTop.lock();
- if ( nBottom == 1 ) {
- refTop.m_nTag = tag_type( Empty );
- value_type * pVal = refTop.m_pVal;
- refTop.m_pVal = nullptr;
- refTop.unlock();
- m_Lock.unlock();
- m_Stat.onPopSuccess();
- return pVal;
- }
+ refTop.lock();
+ if ( nBottom == 1 ) {
+ refTop.m_nTag = tag_type( Empty );
+ value_type * pVal = refTop.m_pVal;
+ refTop.m_pVal = nullptr;
+ refTop.unlock();
+ m_Lock.unlock();
+ m_Stat.onPopSuccess();
+ return pVal;
}
+
node& refBottom = m_Heap[nBottom];
refBottom.lock();
m_Lock.unlock();
refBottom.m_pVal = nullptr;
refBottom.unlock();
- //node& refTop = m_Heap[ 1 ];
- if ( !c_bFairQueue )
- refTop.lock();
-
if ( refTop.m_nTag == tag_type(Empty) ) {
// nBottom == nTop
refTop.unlock();