BasketQueue refactoring (issues #1, #2, #3)
authorkhizmax <libcds.dev@gmail.com>
Wed, 8 Oct 2014 05:01:38 +0000 (09:01 +0400)
committerkhizmax <libcds.dev@gmail.com>
Wed, 8 Oct 2014 05:01:38 +0000 (09:01 +0400)
cds/container/basket_queue.h
cds/intrusive/basket_queue.h
change.log
projects/source.test-hdr.mk
projects/source.test-hdr.offsetof.mk
tests/test-hdr/queue/hdr_basketqueue_dhp.cpp
tests/test-hdr/queue/hdr_basketqueue_hp.cpp
tests/test-hdr/queue/hdr_intrusive_basketqueue_dhp.cpp
tests/test-hdr/queue/hdr_intrusive_basketqueue_hp.cpp
tests/unit/queue/intrusive_queue_type.h
tests/unit/queue/queue_type.h

index c3cda2a784e0e537670e07e4e5623f94ae018198..376600a26c4d523468060d3ccd796ba3c1a76b8c 100644 (file)
@@ -124,8 +124,9 @@ namespace cds { namespace container {
 
             struct intrusive_traits : public traits
             {
-                typedef intrusive::basket_queue::base_hook< opt::gc<gc> > hook;
+                typedef cds::intrusive::basket_queue::base_hook< opt::gc<gc> > hook;
                 typedef node_deallocator disposer;
+                static CDS_CONSTEXPR const cds::intrusive::opt::link_check_type link_checker = cds::intrusive::basket_queue::traits::link_checker;
             };
 
             typedef cds::intrusive::BasketQueue< gc, node_type, intrusive_traits > type;
@@ -209,7 +210,7 @@ namespace cds { namespace container {
 #endif
     {
         //@cond
-        typedef details::make_basket_queue< GC, T, Options... > maker;
+        typedef details::make_basket_queue< GC, T, Traits > maker;
         typedef typename maker::type base_class;
         //@endcond
 
@@ -369,7 +370,6 @@ namespace cds { namespace container {
             typename base_class::dequeue_result res;
             if ( base_class::do_dequeue( res, true )) {
                 f( node_traits::to_value_ptr( *res.pNext )->m_value );
-                base_class::dispose_result( res );
                 return true;
             }
             return false;
index d825142ec4c623e635f3b58a88da160276577ee7..4cace943a92d274863436fa7606ec2e18709e059 100644 (file)
@@ -429,7 +429,7 @@ namespace cds { namespace intrusive {
 
         typedef intrusive::node_to_value<BasketQueue> node_to_value;
         typedef typename opt::details::alignment_setter< atomic_marked_ptr, traits::alignment >::type aligned_node_ptr;
-        typedef typename opt::details::alignment_setter< node_type, options::alignment >::type dummy_node_type;
+        typedef typename opt::details::alignment_setter< node_type, traits::alignment >::type dummy_node_type;
 
         // GC and node_type::gc must be the same
         static_assert( std::is_same<gc, typename node_type::gc>::value, "GC and node_type::gc must be the same");
@@ -577,7 +577,7 @@ namespace cds { namespace intrusive {
 
         void dispose_node( node_type * p )
         {
-            if ( p != m_Dummy.get() ) {
+            if ( p != &m_Dummy ) {
                 struct internal_disposer
                 {
                     void operator()( value_type * p )
@@ -589,8 +589,6 @@ namespace cds { namespace intrusive {
                 };
                 gc::template retire<internal_disposer>( node_traits::to_value_ptr(p) );
             }
-            else
-                m_Dummy.retire();
         }
         //@endcond
 
index 5e4ee2edc6c29436685e647bb1b62f5a584720f5..23f526baf32d438d9475e60861855a18c9da7890 100644 (file)
@@ -5,7 +5,7 @@
       and, seems, unstable.
     - Added: cds::container::TreiberStack::pop_with( Func )
     - Added: member functions enqueue_with(Func), dequeue_with(Func) to cds::container::MSQueue, 
-      cds::container::MoirQueue.
+      cds::container::MoirQueue, cds::container::BasketQueue.
 
 1.6.0 23.09.2014
     General release
index b0f1800206bdaadd759a32c6c7463eec5d7b42a0..4b4fce3f87ccb3073e372ccb3ed8cc2a912b86b5 100644 (file)
@@ -279,13 +279,13 @@ CDS_TESTHDR_MISC := \
     tests/test-hdr/misc/thread_init_fini.cpp
 
 CDS_TESTHDR_SOURCES := \
+    $(CDS_TESTHDR_QUEUE) \
+    $(CDS_TESTHDR_STACK) \
     $(CDS_TESTHDR_MAP) \
     $(CDS_TESTHDR_DEQUE) \
     $(CDS_TESTHDR_ORDLIST) \
     $(CDS_TESTHDR_PQUEUE) \
-    $(CDS_TESTHDR_QUEUE) \
     $(CDS_TESTHDR_SET) \
-    $(CDS_TESTHDR_STACK) \
     $(CDS_TESTHDR_TREE) \
     $(CDS_TESTHDR_MISC)
     
\ No newline at end of file
index 60985c896543c5881abfab3ac5b7314bf76038a7..71f363bdebf1960e210057c4862c49e9ca403363 100644 (file)
@@ -92,10 +92,10 @@ CDS_TESTHDR_OFFSETOF_TREE := \
     tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_sht_member.cpp
 
 CDS_TESTHDR_OFFSETOF_SOURCES := \
+       $(CDS_TESTHDR_OFFSETOF_QUEUE) \
+       $(CDS_TESTHDR_OFFSETOF_STACK) \
        $(CDS_TESTHDR_OFFSETOF_DEQUE) \
        $(CDS_TESTHDR_OFFSETOF_MAP) \
        $(CDS_TESTHDR_OFFSETOF_SET) \
        $(CDS_TESTHDR_OFFSETOF_ORDLIST) \
-       $(CDS_TESTHDR_OFFSETOF_QUEUE) \
-       $(CDS_TESTHDR_OFFSETOF_STACK) \
        $(CDS_TESTHDR_OFFSETOF_TREE)
\ No newline at end of file
index 66034cd686d3123150b4ed4ade4bbe949a1295a9..5303e7f212f6153b90972241c87ca7f0f5666761 100644 (file)
@@ -74,7 +74,7 @@ namespace queue {
                 ,cds::opt::alignment< 16 >
             >::type
         > queue_type;
-        test_ic< queue_type >();
+        test_no_ic< queue_type >();
     }
 
     void HdrTestQueue::BasketQueue_DHP_Counted_relax_align()
@@ -86,7 +86,7 @@ namespace queue {
             enum { alignment = 32 };
         };
         typedef cds::container::BasketQueue < cds::gc::DHP, int, traits > queue_type;
-        test_ic< queue_type >( 0 );
+        test_ic< queue_type >();
     }
 
     void HdrTestQueue::BasketQueue_DHP_seqcst_align()
@@ -109,7 +109,7 @@ namespace queue {
                 ,cds::opt::alignment< cds::opt::cache_line_alignment >
             > ::type
         > queue_type;
-        test_no_ic< queue_type >();
+        test_ic< queue_type >();
     }
 
 }   // namespace queue
index 80b2a5b4f8e9a70a9f1c32d3f4448689b7c29839..5466c1ad3aed0016ce8d6886b90c702e8ec57c14 100644 (file)
@@ -74,7 +74,7 @@ namespace queue {
                 ,cds::opt::alignment< 16 >
             >::type
         > queue_type;
-        test_ic< queue_type >();
+        test_no_ic< queue_type >();
     }
 
     void HdrTestQueue::BasketQueue_HP_Counted_relax_align()
@@ -86,7 +86,7 @@ namespace queue {
             enum { alignment = 32 };
         };
         typedef cds::container::BasketQueue < cds::gc::HP, int, traits > queue_type;
-        test_ic< queue_type >( 0 );
+        test_ic< queue_type >();
     }
 
     void HdrTestQueue::BasketQueue_HP_seqcst_align()
@@ -109,7 +109,7 @@ namespace queue {
                 ,cds::opt::alignment< cds::opt::cache_line_alignment >
             > ::type
         > queue_type;
-        test_no_ic< queue_type >();
+        test_ic< queue_type >();
     }
 
 }   // namespace queue
index 045461888fa9bcc772a3575deda12ee5828759fc..cf10659e817eb1a9972d354d5e09a9882250aa2e 100644 (file)
@@ -44,7 +44,7 @@ namespace queue {
             typename ci::basket_queue::make_traits<
                 ci::opt::hook<
                     ci::basket_queue::member_hook<
-                        offsetof(basket_queue::member_hook_item<cds::gc::DHP>, hMember),
+                        offsetof( member_hook_item, hMember),
                         ci::opt::gc<cds::gc::DHP>
                     >
                 >
@@ -69,7 +69,7 @@ namespace queue {
             typename ci::basket_queue::make_traits<
                 ci::opt::hook<
                     ci::basket_queue::member_hook<
-                        offsetof(basket_queue::member_hook_item<cds::gc::DHP>, hMember),
+                        offsetof(member_hook_item, hMember),
                         ci::opt::gc<cds::gc::DHP>
                     >
                 >
@@ -94,7 +94,7 @@ namespace queue {
             typename ci::basket_queue::make_traits<
                 ci::opt::hook<
                     ci::basket_queue::member_hook<
-                        offsetof(basket_queue::member_hook_item<cds::gc::DHP>, hMember),
+                        offsetof(member_hook_item, hMember),
                         ci::opt::gc<cds::gc::DHP>
                     >
                 >
@@ -120,7 +120,7 @@ namespace queue {
                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
                 ,ci::opt::hook<
                     ci::basket_queue::member_hook<
-                        offsetof(basket_queue::member_hook_item<cds::gc::DHP>, hMember),
+                        offsetof(member_hook_item, hMember),
                         ci::opt::gc<cds::gc::DHP>
                     >
                 >
@@ -145,7 +145,7 @@ namespace queue {
             typename ci::basket_queue::make_traits<
                 ci::opt::hook<
                     ci::basket_queue::member_hook<
-                        offsetof(basket_queue::member_hook_item<cds::gc::DHP>, hMember),
+                        offsetof(member_hook_item, hMember),
                         ci::opt::gc<cds::gc::DHP>
                     >
                 >
index f2e0242a82a0dd96e2748aa541e9e2ab18043139..983a9927f6b940a5699e7ce21738063c9268ee98 100644 (file)
@@ -70,7 +70,7 @@ namespace queue {
             typename ci::basket_queue::make_traits<
                 ci::opt::hook<
                     ci::basket_queue::member_hook<
-                        offsetof(basket_queue::member_hook_item<cds::gc::HP>, hMember),
+                        offsetof( member_hook_item, hMember),
                         ci::opt::gc<cds::gc::HP>
                     >
                 >
index f5c7e612aa4f97a76ff8f50bb4f8c00063401e55..c4ff9ca25bb9be99902be54851ce26977eda534b 100644 (file)
@@ -433,6 +433,24 @@ namespace queue {
 namespace std {
 
     // cds::intrusive::queue_stat
+    template <typename Counter>
+    static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
+    {
+        return o
+            << "\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";
+    }
+    static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
+    {
+        return o;
+    }
+
+
     template <typename Counter>
     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s)
     {
@@ -490,21 +508,6 @@ namespace std {
         return o;
     }
 
-    // cds::intrusive::basket_queue::stat
-    template <typename Counter>
-    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s )
-    {
-        return o
-            << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
-            << "\t\tTry Add basket count: " << s.m_TryAddBasket.get() << "\n"
-            << "\t\t    Add basket count: " << s.m_AddBasketCount.get() << "\n";
-    }
-
-    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::dummy_stat const& s )
-    {
-        return o;
-    }
-
     // cds::intrusive::fcqueue::stat
     template <typename Counter>
     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
index 64f92b93982276c6403989eb9833983039d5d2da..6b4509562d8bf18fe01dde9735e20c7ce8af77c0 100644 (file)
@@ -518,7 +518,23 @@ 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)
+    {
+        return o
+            << "\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\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
+            << "\t\t           Bad tail: " << s.m_BadTail.get() << "\n";
+    }
+    static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
+    {
+        return o;
+    }
+
     template <typename Counter>
     static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_queue::stat<Counter> const& s)
     {
@@ -538,7 +554,6 @@ namespace std {
         return o;
     }
 
-
     template <typename Counter>
     static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::stat<Counter> const& s )
     {
@@ -567,9 +582,14 @@ 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\t Advance 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 )
@@ -577,21 +597,6 @@ namespace std {
         return o;
     }
 
-    // cds::intrusive::basket_queue::stat
-    template <typename Counter>
-    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s )
-    {
-        return o
-            << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
-            << "\t\tTry Add basket count: " << s.m_TryAddBasket.get() << "\n"
-            << "\t\t    Add basket count: " << s.m_AddBasketCount.get() << "\n";
-    }
-
-    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::dummy_stat const& s )
-    {
-        return o;
-    }
-
     // cds::container::fcqueue::stat
     template <typename Counter>
     static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::stat<Counter> const& s )