Small refactoring, doc fix
authorkhizmax <libcds.dev@gmail.com>
Sat, 14 Mar 2015 17:47:22 +0000 (20:47 +0300)
committerkhizmax <libcds.dev@gmail.com>
Sat, 14 Mar 2015 17:47:22 +0000 (20:47 +0300)
cds/container/vyukov_mpmc_cycle_queue.h

index 1899ac0a9d31d8a0129ffa62814f6ad76768c22d..0244e360da38232c35d03a483cd8e940d9470b78 100644 (file)
@@ -60,7 +60,7 @@ namespace cds { namespace container {
             - \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
@@ -173,6 +173,8 @@ namespace cds { namespace container {
         /// 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
@@ -185,7 +187,7 @@ namespace cds { namespace container {
             // 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);
@@ -220,9 +222,8 @@ namespace cds { namespace container {
 
                 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)
@@ -276,9 +277,8 @@ namespace cds { namespace container {
 
                 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)
@@ -319,7 +319,7 @@ namespace cds { namespace container {
                 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)
@@ -330,8 +330,8 @@ namespace cds { namespace container {
 
             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;
         }
@@ -391,7 +391,7 @@ namespace cds { namespace container {
         /// 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
         {