OptimisticQueue, RWQueue refactoring (issues #1,#2,#3)
authorkhizmax <libcds.dev@gmail.com>
Thu, 9 Oct 2014 04:48:47 +0000 (08:48 +0400)
committerkhizmax <libcds.dev@gmail.com>
Thu, 9 Oct 2014 04:48:47 +0000 (08:48 +0400)
cds/container/optimistic_queue.h
cds/container/rwqueue.h
projects/source.test-hdr.mk
tests/unit/queue/intrusive_queue_type.h
tests/unit/queue/queue_type.h

index 800e654cf7333c15f013439f57befe2352807f09..cf1b0d63d7fa014288df66c2817443c6b8b72763 100644 (file)
@@ -97,17 +97,6 @@ namespace cds { namespace container {
             typedef T value_type;
             typedef Traits traits;
 
-            /*
-            struct default_options {
-                typedef cds::backoff::empty     back_off;
-                typedef CDS_DEFAULT_ALLOCATOR   allocator;
-                typedef atomicity::empty_item_counter item_counter;
-                typedef intrusive::optimistic_queue::dummy_stat stat;
-                typedef opt::v::relaxed_ordering    memory_model;
-                enum { alignment = opt::cache_line_alignment };
-            };
-            */
-
             struct node_type: public cds::intrusive::optimistic_queue::node< gc >
             {
                 value_type  m_value;
@@ -171,7 +160,7 @@ namespace cds { namespace container {
             > myQueue;
             \endcode
     */
-    template <typename GC, typename T, typename Traits>
+    template <typename GC, typename T, typename Traits = optimistic_queue::traits >
     class OptimisticQueue:
 #ifdef CDS_DOXYGEN_INVOKED
         private intrusive::OptimisticQueue< GC, cds::intrusive::optimistic_queue::node< T >, Traits >
@@ -322,7 +311,6 @@ namespace cds { namespace container {
         */
         bool dequeue( value_type& dest )
         {
-            typedef cds::details::trivial_assign<value_type, value_type> functor;
             return dequeue_with( [&dest]( value_type& src ) { dest = src; } );
         }
 
index 1622670751576e9b1301e60562afbd2bbab0f4fc..0ee16f90f957b050d652537596a1e88210950a72 100644 (file)
@@ -36,8 +36,6 @@ namespace cds { namespace container {
             - 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.
             - opt::alignment - the alignment for internal queue data. Default is \p opt::cache_line_alignment
-            - opt::memory_model - C++ memory ordering model. Can be \p opt::v::relaxed_ordering (relaxed memory model, the default)
-                or \p opt::v::sequential_consistent (sequentially consisnent memory model).
 
             Example: declare mutex-based \p %RWQueue with item counting
             \code
@@ -107,7 +105,6 @@ namespace cds { namespace container {
 
         typedef typename traits::lock_type  lock_type;      ///< Locking primitive
         typedef typename traits::item_counter item_counter; ///< Item counting policy used
-        typedef typename traits::memory_model memory_model;   ///< Memory ordering. See \p cds::opt::memory_model option
 
     protected:
         //@cond
@@ -216,7 +213,7 @@ namespace cds { namespace container {
         bool enqueue( value_type const& data )
         {
             scoped_node_ptr p( alloc_node( data ));
-            if ( enqueue_node( p )) {
+            if ( enqueue_node( p.get() )) {
                 p.release();
                 return true;
             }
@@ -238,7 +235,7 @@ namespace cds { namespace container {
         {
             scoped_node_ptr p( alloc_node() );
             f( p->m_value );
-            if ( enqueue_node( p ) ) {
+            if ( enqueue_node( p.get() )) {
                 p.release();
                 return true;
             }
@@ -277,7 +274,7 @@ namespace cds { namespace container {
         */
         bool dequeue( value_type& dest )
         {
-            return dequeue( [&dest]( value_type * src ) { dest = src; } );
+            return dequeue_with( [&dest]( value_type& src ) { dest = src; } );
         }
 
         /// Dequeues a value using a functor
index 4b4fce3f87ccb3073e372ccb3ed8cc2a912b86b5..8940eed18192ba0914643da7d022262b8893a524 100644 (file)
@@ -129,8 +129,8 @@ CDS_TESTHDR_QUEUE := \
     tests/test-hdr/queue/hdr_moirqueue_dhp.cpp \
     tests/test-hdr/queue/hdr_msqueue_hp.cpp \
     tests/test-hdr/queue/hdr_msqueue_dhp.cpp \
-    tests/test-hdr/queue/hdr_optimistic_hzp.cpp \
-    tests/test-hdr/queue/hdr_optimistic_ptb.cpp \
+    tests/test-hdr/queue/hdr_optimistic_hp.cpp \
+    tests/test-hdr/queue/hdr_optimistic_dhp.cpp \
     tests/test-hdr/queue/hdr_rwqueue.cpp \
     tests/test-hdr/queue/hdr_segmented_queue_hp.cpp \
     tests/test-hdr/queue/hdr_segmented_queue_ptb.cpp \
index 9a0e99b51e864fcf594a75a51e8e62453f2311b4..e073626cc87b5b1b02c59fc2aced74cbf3d6ce6a 100644 (file)
@@ -452,7 +452,7 @@ namespace queue {
 // *********************************************
 // Queue statistics
 namespace std {
-
+    /*
     // cds::intrusive::queue_stat
     template <typename Counter>
     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
@@ -470,6 +470,7 @@ namespace std {
     {
         return o;
     }
+    */
 
 
     template <typename Counter>
@@ -519,12 +520,17 @@ namespace std {
     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
     {
         return o
-            << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
-            << "\t\t"
-            << "\t\t    fix list call: " << s.m_FixListCount.get() << "\n";
+            << "\tStatistics:\n"
+            << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
+            << "\t\t      Enqueue race: " << s.m_EnqueueRace.get() << "\n"
+            << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
+            << "\t\t      Dequeue race: " << s.m_DequeueRace.get() << "\n"
+            << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
+            << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n"
+            << "\t\t     fix list call: " << s.m_FixListCount.get() << "\n";
     }
 
-    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::empty_stat const& s )
     {
         return o;
     }
index 2bb57bb03c7bf1cdbed97cf3f960490fa178662d..9fa554f66d263f0c555ed9b8f0b03139b2ebea32 100644 (file)
@@ -150,7 +150,7 @@ namespace queue {
 
         // OptimisticQueue
         typedef cds::container::OptimisticQueue< cds::gc::HP, Value > OptimisticQueue_HP;
-        typedef cds::container::OptimisticQueue< cds::gc::PTB, Value > OptimisticQueue_PTB;
+        typedef cds::container::OptimisticQueue< cds::gc::DHP, Value > OptimisticQueue_DHP;
 
         struct traits_OptimisticQueue_michaelAlloc : public cds::container::optimistic_queue::traits
         {
@@ -175,7 +175,7 @@ namespace queue {
 
         struct traits_OptimisticQueue_stat : public
             cds::container::optimistic_queue::make_traits <
-                cds::opt::stat < cds::intrusive::queue_stat<> >
+                cds::opt::stat < cds::intrusive::optimistic_queue::stat<> >
             > ::type
         {};
         typedef cds::container::OptimisticQueue< cds::gc::HP,  Value, traits_OptimisticQueue_stat > OptimisticQueue_HP_stat;
@@ -384,7 +384,7 @@ namespace queue {
                 cds::opt::lock_type< std::mutex >
             >::type
         {};
-        typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > traits_RWQueue_mutex;
+        typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > RWQueue_mutex;
 
         // FCQueue
         class traits_FCQueue_elimination:
@@ -500,7 +500,7 @@ namespace queue {
 // *********************************************
 // Queue statistics
 namespace std {
-
+    /*
     template <typename Counter>
     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
     {
@@ -517,6 +517,7 @@ namespace std {
     {
         return o;
     }
+    */
 
     template <typename Counter>
     static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_queue::stat<Counter> const& s)