TreiberStack refactoring (issues #1, #2, #3 done)
authorkhizmax <libcds.dev@gmail.com>
Sat, 4 Oct 2014 17:35:14 +0000 (21:35 +0400)
committerkhizmax <libcds.dev@gmail.com>
Sat, 4 Oct 2014 17:35:14 +0000 (21:35 +0400)
13 files changed:
cds/container/treiber_stack.h
cds/intrusive/details/single_link_struct.h
cds/intrusive/treiber_stack.h
tests/test-hdr/stack/hdr_elimination_stack_dhp.cpp
tests/test-hdr/stack/hdr_intrusive_elimination_stack_dhp.cpp
tests/test-hdr/stack/hdr_intrusive_elimination_stack_hp.cpp
tests/test-hdr/stack/hdr_intrusive_treiber_stack_dhp.cpp
tests/test-hdr/stack/hdr_intrusive_treiber_stack_hp.cpp
tests/test-hdr/stack/hdr_treiber_stack.h
tests/test-hdr/stack/hdr_treiber_stack_dhp.cpp
tests/unit/stack/intrusive_stack_defs.h
tests/unit/stack/intrusive_stack_type.h
tests/unit/stack/stack_type.h

index 5176e8ce8579f4aa51936511ed88ff93fa912a3f..604d9ab4fdceb768b69b72c4630a0288aa35b410 100644 (file)
@@ -14,7 +14,7 @@ namespace cds { namespace container {
     */
     namespace treiber_stack {
         /// Internal statistics
-        template <typename Counter = cds::atomicity::event_counter>
+        template <typename Counter = cds::intrusive::treiber_stack::stat<>::counter_type >
         using stat = cds::intrusive::treiber_stack::stat< Counter >;
 
         /// Dummy internal statistics
@@ -99,6 +99,16 @@ namespace cds { namespace container {
                 Default is \p opt::v::c_rand.
             - opt::elimination_backoff - back-off strategy to wait for elimination, default is \p cds::backoff::delay<>
             - opt::lock_type - a lock type used in elimination back-off, default is \p cds::lock::Spin.
+
+            Example: declare %TreiberStack with item counting and internal statistics using \p %make_traits
+            \code
+            typedef cds::container::TreiberStack< cds::gc::HP, Foo,
+                typename cds::container::treiber_stack::make_traits<
+                    cds::opt::item_counter< cds::atomicity::item_counter >,
+                    cds::opt::stat< cds::intrusive::treiber_stack::stat<> >
+                >::type
+            > myStack;
+            \endcode
         */
         template <typename... Options>
         struct make_traits {
@@ -208,7 +218,7 @@ namespace cds { namespace container {
         /// Rebind template arguments
         template <typename GC2, typename T2, typename Traits2>
         struct rebind {
-            typedef TreiberStack< GC2, T2, Traits2> other   ;   ///< Rebinding result
+            typedef TreiberStack< GC2, T2, Traits2 > other;   ///< Rebinding result
         };
 
     public:
index 86363980be1458f982693ec5311aa65da8d798f3..8796e35c0709806a25d95ab4d9af16184adf1041 100644 (file)
@@ -104,7 +104,7 @@ namespace cds { namespace intrusive {
             typedef typename options::gc    gc;
             typedef typename options::tag   tag;
             typedef node<gc, tag> node_type;
-            typedef HookType     hook_type;
+            typedef HookType      hook_type;
         };
         //@endcond
 
index 3b0175127c6b45936dcc6d87bbf85b344330ea2d..af1efe34261f0075c321b479d704678b20c45d77 100644 (file)
@@ -4,7 +4,6 @@
 #define __CDS_INTRUSIVE_TREIBER_STACK_H
 
 #include <type_traits>
-#include <functional>   // ref
 #include <mutex>        // unique_lock
 #include <cds/intrusive/details/single_link_struct.h>
 #include <cds/algo/elimination.h>
@@ -124,7 +123,10 @@ namespace cds { namespace intrusive {
                 else
                     ++m_PassivePopCollision;
             }
-            void onEliminationFailed()          { ++m_EliminationFailed;}
+            void onEliminationFailed() 
+            {
+                ++m_EliminationFailed;
+            }
             //@endcond
         };
 
@@ -232,6 +234,17 @@ namespace cds { namespace intrusive {
                 Default is \p opt::v::c_rand.
             - opt::elimination_backoff - back-off strategy to wait for elimination, default is \p cds::backoff::delay<>
             - opt::lock_type - a lock type used in elimination back-off, default is \p cds::lock::Spin.
+
+            Example: declare \P %TreiberStack with elimination enabled and internal statistics
+            \code
+            typedef cds::intrusive::TreiberStack< cds::gc::HP, Foo, 
+                typename cds::intrusive::treiber_stack::make_traits<
+                    cds::opt::enable_elimination< true >,
+                    cds::opt::stat< cds::container::treiber_stack::stat<> >
+                >::type
+            > myStack;
+            \endcode
+
         */
         template <typename... Options>
         struct make_traits {
@@ -578,7 +591,7 @@ namespace cds { namespace intrusive {
         typedef Traits  traits;         ///< Stack traits
 
         typedef typename traits::hook      hook;        ///< hook type
-        typedef typename traits::node_type node_type;   ///< node type
+        typedef typename hook::node_type   node_type;   ///< node type
         typedef typename traits::disposer  disposer;    ///< disposer used
         typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
         typedef typename single_link::get_link_checker< node_type, traits::link_checker >::type link_checker   ;   ///< link checker
@@ -608,6 +621,12 @@ namespace cds { namespace intrusive {
 
         typedef intrusive::node_to_value<TreiberStack>  node_to_value;
         typedef treiber_stack::operation< value_type >  operation_desc;
+
+        // 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");
+
+        static_assert( !enable_elimination || std::is_same<typename elimination_random_engine::result_type, unsigned int>::value,
+                       "Random engine result type must be unsigned int");
         //@endcond
 
     protected:
@@ -619,24 +638,13 @@ namespace cds { namespace intrusive {
 
         template <bool EnableElimination>
         struct elimination_backoff_impl;
-
-        void init()
-        {
-            // 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");
-
-            static_assert( (!enable_elimination || std::is_same<typename elimination_random_engine::result_type, unsigned int>::value),
-                "Random engine result type must be unsigned int" );
-        }
         //@endcond
 
     public:
         /// Constructs empty stack
         TreiberStack()
             : m_Top( nullptr )
-        {
-            init();
-        }
+        {}
 
         /// Constructs empty stack and initializes elimination back-off data
         /**
@@ -647,9 +655,7 @@ namespace cds { namespace intrusive {
         TreiberStack( size_t nCollisionCapacity )
             : m_Top( nullptr )
             , m_Backoff( nCollisionCapacity )
-        {
-            init();
-        }
+        {}
 
         /// \p %TreiberStack is not copy-constructible
         TreiberStack( TreiberStack const& ) = delete;
index 9532461b0e61a207b85dd4d4c52ecb1bb235a3c8..fb5323e7215f5ff7d391cb78403821e94f329d16 100644 (file)
@@ -57,7 +57,7 @@ namespace stack {
 
         typedef cs::TreiberStack< cds::gc::DHP, int
             , typename cs::treiber_stack::make_traits<
-                ,cds::opt::back_off< cds::backoff::pause>
+                cds::opt::back_off< cds::backoff::pause >
                 ,cds::opt::allocator< std::allocator< bool * > >
                 ,cds::opt::enable_elimination<true>
             >::type
index 7ad4c173dd00d78639f099bb480aad3f0057e9db..bed89648dd0f9d1bdbdd781359532577b004fbe0 100644 (file)
@@ -16,7 +16,7 @@ namespace stack {
             , typename ci::treiber_stack::make_traits<
                 cds::opt::enable_elimination<true>
                 ,ci::opt::hook<
-                    ci::single_link::base_hook< ci::opt::gc<cds::gc::DHP> >
+                    ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::DHP> >
                 >
             >::type
         > Elimination_DHP_base;
@@ -25,7 +25,7 @@ namespace stack {
             TestIntrusiveStack::base_hook_item<cds::gc::DHP>
             , typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::base_hook< ci::opt::gc<cds::gc::DHP> >
+                    ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::DHP> >
                 >
                 ,cds::opt::enable_elimination<true>
                 ,ci::opt::buffer< ci::opt::v::dynamic_buffer<void *> >
@@ -36,7 +36,7 @@ namespace stack {
             TestIntrusiveStack::base_hook_item<cds::gc::DHP>
             , typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::base_hook< ci::opt::gc<cds::gc::DHP> >
+                    ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::DHP> >
                 >
                 ,cds::opt::enable_elimination<true>
                 ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
@@ -48,7 +48,7 @@ namespace stack {
             TestIntrusiveStack::base_hook_item<cds::gc::DHP>
             , typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::base_hook< ci::opt::gc<cds::gc::DHP> >
+                    ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::DHP> >
                 >
                 ,cds::opt::enable_elimination<true>
                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
@@ -59,7 +59,7 @@ namespace stack {
             TestIntrusiveStack::base_hook_item<cds::gc::DHP>
             , typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::base_hook< ci::opt::gc<cds::gc::DHP> >
+                    ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::DHP> >
                 >
                 ,cds::opt::enable_elimination<true>
                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
@@ -72,7 +72,7 @@ namespace stack {
             TestIntrusiveStack::member_hook_item<cds::gc::DHP>
             , typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::DHP>, hMember),
                         ci::opt::gc<cds::gc::DHP>
                     >
@@ -85,7 +85,7 @@ namespace stack {
             TestIntrusiveStack::member_hook_item<cds::gc::DHP>
             , typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::DHP>, hMember),
                         ci::opt::gc<cds::gc::DHP>
                     >
@@ -99,7 +99,7 @@ namespace stack {
             TestIntrusiveStack::member_hook_item<cds::gc::DHP>
             , typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::DHP>, hMember),
                         ci::opt::gc<cds::gc::DHP>
                     >
@@ -114,7 +114,7 @@ namespace stack {
             TestIntrusiveStack::member_hook_item<cds::gc::DHP>
             , typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::DHP>, hMember),
                         ci::opt::gc<cds::gc::DHP>
                     >
@@ -128,7 +128,7 @@ namespace stack {
             TestIntrusiveStack::member_hook_item<cds::gc::DHP>
             , typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::DHP>, hMember),
                         ci::opt::gc<cds::gc::DHP>
                     >
index f3c30e08222ed1de1f2cda2838987598a8b2314f..e44d573d42437577411e299a156b3a8855a00182 100644 (file)
@@ -31,7 +31,7 @@ namespace stack {
             , typename ci::treiber_stack::make_traits<
                 cds::opt::enable_elimination<true>
                 ,ci::opt::hook<
-                    ci::single_link::base_hook<
+                    ci::treiber_stack::base_hook<
                         ci::opt::gc<cds::gc::HP>
                     >
                 >
@@ -43,7 +43,7 @@ namespace stack {
             , typename ci::treiber_stack::make_traits<
                 cds::opt::enable_elimination<true>
                 ,ci::opt::hook<
-                    ci::single_link::base_hook<
+                    ci::treiber_stack::base_hook<
                         ci::opt::gc<cds::gc::HP>
                     >
                 >
@@ -56,7 +56,7 @@ namespace stack {
             , typename ci::treiber_stack::make_traits<
                 cds::opt::enable_elimination<true>
                 ,ci::opt::hook<
-                    ci::single_link::base_hook<
+                    ci::treiber_stack::base_hook<
                         ci::opt::gc<cds::gc::HP>
                     >
                 >
@@ -70,7 +70,7 @@ namespace stack {
             , typename ci::treiber_stack::make_traits<
                 cds::opt::enable_elimination<true>
                 ,ci::opt::hook<
-                    ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+                    ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::HP> >
                 >
                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
             >::type
@@ -81,7 +81,7 @@ namespace stack {
             , typename ci::treiber_stack::make_traits<
                 cds::opt::enable_elimination<true>
                 ,ci::opt::hook<
-                    ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+                    ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::HP> >
                 >
                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
                 ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
@@ -94,7 +94,7 @@ namespace stack {
             , typename ci::treiber_stack::make_traits<
                 cds::opt::enable_elimination<true>
                 ,ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
                         ci::opt::gc<cds::gc::HP>
                     >
@@ -107,7 +107,7 @@ namespace stack {
             , typename ci::treiber_stack::make_traits<
                 cds::opt::enable_elimination<true>
                 ,ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
                         ci::opt::gc<cds::gc::HP>
                     >
@@ -121,7 +121,7 @@ namespace stack {
             , typename ci::treiber_stack::make_traits<
                 cds::opt::enable_elimination<true>
                 ,ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
                         ci::opt::gc<cds::gc::HP>
                     >
@@ -136,7 +136,7 @@ namespace stack {
             , typename ci::treiber_stack::make_traits<
                 cds::opt::enable_elimination<true>
                 ,ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
                         ci::opt::gc<cds::gc::HP>
                     >
@@ -150,7 +150,7 @@ namespace stack {
             , typename ci::treiber_stack::make_traits<
                 cds::opt::enable_elimination<true>
                 ,ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
                         ci::opt::gc<cds::gc::HP>
                     >
index 37a90bdffe40fe004b42727c94713037ecc0ddd1..a8c396d07fe24a43d6d421308579fe3cd69fcea5 100644 (file)
@@ -1,7 +1,7 @@
 //$$CDS-header$$
 
 #include "hdr_intrusive_treiber_stack.h"
-#include <cds/gc/ptb.h>
+#include <cds/gc/dhp.h>
 #include <cds/intrusive/treiber_stack.h>
 
 namespace stack {
@@ -14,7 +14,7 @@ namespace stack {
             TestIntrusiveStack::base_hook_item<cds::gc::DHP>
             ,typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::base_hook< ci::opt::gc<cds::gc::DHP> >
+                    ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::DHP> >
                 >
             >::type
         > Treiber_DHP_base;
@@ -23,7 +23,7 @@ namespace stack {
             TestIntrusiveStack::base_hook_item<cds::gc::DHP>
             ,typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::base_hook< ci::opt::gc<cds::gc::DHP> >
+                    ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::DHP> >
                 >
                 ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
             >::type
@@ -34,7 +34,7 @@ namespace stack {
             TestIntrusiveStack::base_hook_item<cds::gc::DHP>
             ,typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::base_hook< ci::opt::gc<cds::gc::DHP> >
+                    ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::DHP> >
                 >
                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
             >::type
@@ -44,7 +44,7 @@ namespace stack {
             TestIntrusiveStack::base_hook_item<cds::gc::DHP>
             ,typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::base_hook< ci::opt::gc<cds::gc::DHP> >
+                    ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::DHP> >
                 >
                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
                 ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
@@ -56,7 +56,7 @@ namespace stack {
             TestIntrusiveStack::member_hook_item<cds::gc::DHP>
             ,typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::DHP>, hMember),
                         ci::opt::gc<cds::gc::DHP>
                     >
@@ -68,7 +68,7 @@ namespace stack {
             TestIntrusiveStack::member_hook_item<cds::gc::DHP>
             ,typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::DHP>, hMember),
                         ci::opt::gc<cds::gc::DHP>
                     >
@@ -82,7 +82,7 @@ namespace stack {
             TestIntrusiveStack::member_hook_item<cds::gc::DHP>
             , typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::DHP>, hMember),
                         ci::opt::gc<cds::gc::DHP>
                     >
@@ -95,7 +95,7 @@ namespace stack {
             TestIntrusiveStack::member_hook_item<cds::gc::DHP>
             , typename ci::treiber_stack::make_traits<
                 ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::DHP>, hMember),
                         ci::opt::gc<cds::gc::DHP>
                     >
index 3a982452575a3f917c8bcad09ecf2941c5a9b038..c4bc7b1b52b37c2df6458810ecd5bd0bdbe86d8f 100644 (file)
@@ -23,17 +23,19 @@ namespace stack {
         // HZP GC + base hook
         typedef cds::intrusive::TreiberStack< cds::gc::HP,
             TestIntrusiveStack::base_hook_item<cds::gc::HP>
-            ,ci::opt::hook<
-                ci::single_link::base_hook<
-                    ci::opt::gc<cds::gc::HP>
+            , typename ci::treiber_stack::make_traits<
+                ci::opt::hook<
+                    ci::treiber_stack::base_hook<
+                        ci::opt::gc<cds::gc::HP>
+                    >
                 >
-            >
+            >::type
         > Treiber_HP_base;
 
         struct traits_Treiber_HP_base_relaxed
             : ci::treiber_stack::make_traits <
                 ci::opt::hook<
-                    ci::single_link::base_hook<
+                    ci::treiber_stack::base_hook<
                         ci::opt::gc<cds::gc::HP>
                     >
                 >
@@ -49,7 +51,7 @@ namespace stack {
         struct traits_Treiber_HP_base_disposer
             : ci::treiber_stack::make_traits <
                 ci::opt::hook<
-                    ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+                    ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::HP> >
                 >
                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
             >::type
@@ -63,7 +65,7 @@ namespace stack {
             TestIntrusiveStack::base_hook_item<cds::gc::HP>
             ,typename ci::treiber_stack::make_traits <
                 ci::opt::hook<
-                    ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+                    ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::HP> >
                 >
                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
                 ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
@@ -74,7 +76,7 @@ namespace stack {
         struct traits_Treiber_HP_member
             : ci::treiber_stack::make_traits <
                 ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
                         ci::opt::gc<cds::gc::HP>
                     >
@@ -89,7 +91,7 @@ namespace stack {
         struct traits_Treiber_HP_member_relaxed
             : ci::treiber_stack::make_traits <
                 ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
                         ci::opt::gc<cds::gc::HP>
                     >
@@ -106,7 +108,7 @@ namespace stack {
         struct traits_Treiber_HP_member_disposer
             : ci::treiber_stack::make_traits <
                 ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
                         ci::opt::gc<cds::gc::HP>
                     >
@@ -122,7 +124,7 @@ namespace stack {
         struct traits_Treiber_HP_member_disposer_relaxed
             : ci::treiber_stack::make_traits <
                 ci::opt::hook<
-                    ci::single_link::member_hook<
+                    ci::treiber_stack::member_hook<
                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
                         ci::opt::gc<cds::gc::HP>
                     >
index 3767be718fac7a83fb0fd9b143c59376749d2c62..2110ae00e86b5f7a61b15e65f0afb34d9c3b4529 100644 (file)
@@ -38,7 +38,7 @@ namespace stack {
             CPPUNIT_ASSERT( stack.pop(v) );
             CPPUNIT_ASSERT( v == 3 );
             CPPUNIT_ASSERT( !stack.empty() );
-            CPPUNIT_ASSERT( stack.pop_with( [&v]( value_type& src ) { v = src; } );
+            CPPUNIT_ASSERT( stack.pop_with( [&v]( value_type& src ) { v = src; } ));
             CPPUNIT_ASSERT( v == 2 );
             CPPUNIT_ASSERT( !stack.empty() );
             CPPUNIT_ASSERT( stack.pop(v) );
index 9a5ca198640adacfc431e703dbae70e4a3431908..6b8da9a580fc8e1f4e2a5ce265c14e59da649fe9 100644 (file)
@@ -1,7 +1,7 @@
 //$$CDS-header$$
 
 #include "hdr_treiber_stack.h"
-#include <cds/gc/ptb.h>
+#include <cds/gc/dhp.h>
 #include <cds/container/treiber_stack.h>
 
 namespace stack {
@@ -10,48 +10,48 @@ namespace stack {
 
     namespace defs { namespace {
 
-        typedef cs::TreiberStack< cds::gc::PTB, int > Treiber_PTB;
-        typedef cs::TreiberStack< cds::gc::PTB, int
+        typedef cs::TreiberStack< cds::gc::DHP, int > Treiber_DHP;
+        typedef cs::TreiberStack< cds::gc::DHP, int
             , typename cs::treiber_stack::make_traits<
                 cds::opt::memory_model<cds::opt::v::relaxed_ordering> 
             >::type
-        > Treiber_PTB_relaxed;
+        > Treiber_DHP_relaxed;
 
-        typedef cs::TreiberStack< cds::gc::PTB, int
+        typedef cs::TreiberStack< cds::gc::DHP, int
             , typename cs::treiber_stack::make_traits<
                 cds::opt::back_off< cds::backoff::yield> 
             >::type
-        > Treiber_PTB_yield;
+        > Treiber_DHP_yield;
 
-        typedef cs::TreiberStack< cds::gc::PTB, int
+        typedef cs::TreiberStack< cds::gc::DHP, int
             , typename cs::treiber_stack::make_traits<
                 cds::opt::back_off< cds::backoff::yield>
                 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
             >::type
-        > Treiber_PTB_yield_relaxed;
+        > Treiber_DHP_yield_relaxed;
 
-        typedef cs::TreiberStack< cds::gc::PTB, int
+        typedef cs::TreiberStack< cds::gc::DHP, int
             , typename cs::treiber_stack::make_traits<
                 cds::opt::back_off< cds::backoff::pause>
                 ,cds::opt::allocator< std::allocator< bool * > >
             >::type
-        > Treiber_PTB_pause_alloc;
+        > Treiber_DHP_pause_alloc;
 
-        typedef cs::TreiberStack< cds::gc::PTB, int
+        typedef cs::TreiberStack< cds::gc::DHP, int
             , typename cs::treiber_stack::make_traits<
                 cds::opt::memory_model<cds::opt::v::relaxed_ordering>
                 ,cds::opt::back_off< cds::backoff::pause>
                 ,cds::opt::allocator< std::allocator< bool * > >
             >::type
-        > Treiber_PTB_pause_alloc_relaxed;
+        > Treiber_DHP_pause_alloc_relaxed;
     }}
 
-    TEST(Treiber_PTB)
-    TEST(Treiber_PTB_yield)
-    TEST(Treiber_PTB_pause_alloc)
+    TEST(Treiber_DHP)
+    TEST(Treiber_DHP_yield)
+    TEST(Treiber_DHP_pause_alloc)
 
-    TEST(Treiber_PTB_relaxed)
-    TEST(Treiber_PTB_yield_relaxed)
-    TEST(Treiber_PTB_pause_alloc_relaxed)
+    TEST(Treiber_DHP_relaxed)
+    TEST(Treiber_DHP_yield_relaxed)
+    TEST(Treiber_DHP_pause_alloc_relaxed)
 
 }
index fc57127d321f00a41b61ebe983e8268f33e41e15..2e52a334af9209f2ea09d9a70aa6affb4ca9d22e 100644 (file)
@@ -4,18 +4,18 @@
 #define __CDSUNIT_INTRUSIVE_STACK_DEFS_H
 
 #define CDSUNIT_DECLARE_TreiberStack \
-    TEST_CASE( Treiber_HP, cds::intrusive::single_link::node< cds::gc::HP >        ) \
-    TEST_CASE( Treiber_HP_seqcst, cds::intrusive::single_link::node< cds::gc::HP > ) \
-    /*TEST_CASE( Treiber_HP_yield, cds::intrusive::single_link::node< cds::gc::HP >  )*/ \
-    TEST_CASE( Treiber_HP_pause, cds::intrusive::single_link::node< cds::gc::HP >  ) \
-    TEST_CASE( Treiber_HP_exp, cds::intrusive::single_link::node< cds::gc::HP >    ) \
-    TEST_CASE( Treiber_HP_stat, cds::intrusive::single_link::node< cds::gc::HP >   ) \
-    /*TEST_CASE( Treiber_HRC_yield, cds::intrusive::single_link::node< cds::gc::HRC > )*/ \
-    TEST_CASE( Treiber_DHP, cds::intrusive::single_link::node< cds::gc::DHP >       ) \
-    /*TEST_CASE( Treiber_DHP_yield, cds::intrusive::single_link::node< cds::gc::DHP > )*/ \
-    TEST_CASE( Treiber_DHP_pause, cds::intrusive::single_link::node< cds::gc::DHP > ) \
-    TEST_CASE( Treiber_DHP_exp, cds::intrusive::single_link::node< cds::gc::DHP >   ) \
-    TEST_CASE( Treiber_DHP_stat, cds::intrusive::single_link::node< cds::gc::DHP >  )
+    TEST_CASE( Treiber_HP, cds::intrusive::treiber_stack::node< cds::gc::HP >        ) \
+    TEST_CASE( Treiber_HP_seqcst, cds::intrusive::treiber_stack::node< cds::gc::HP > ) \
+    /*TEST_CASE( Treiber_HP_yield, cds::intrusive::treiber_stack::node< cds::gc::HP >  )*/ \
+    TEST_CASE( Treiber_HP_pause, cds::intrusive::treiber_stack::node< cds::gc::HP >  ) \
+    TEST_CASE( Treiber_HP_exp, cds::intrusive::treiber_stack::node< cds::gc::HP >    ) \
+    TEST_CASE( Treiber_HP_stat, cds::intrusive::treiber_stack::node< cds::gc::HP >   ) \
+    /*TEST_CASE( Treiber_HRC_yield, cds::intrusive::treiber_stack::node< cds::gc::HRC > )*/ \
+    TEST_CASE( Treiber_DHP, cds::intrusive::treiber_stack::node< cds::gc::DHP >       ) \
+    /*TEST_CASE( Treiber_DHP_yield, cds::intrusive::treiber_stack::node< cds::gc::DHP > )*/ \
+    TEST_CASE( Treiber_DHP_pause, cds::intrusive::treiber_stack::node< cds::gc::DHP > ) \
+    TEST_CASE( Treiber_DHP_exp, cds::intrusive::treiber_stack::node< cds::gc::DHP >   ) \
+    TEST_CASE( Treiber_DHP_stat, cds::intrusive::treiber_stack::node< cds::gc::DHP >  )
 
 #define CDSUNIT_TEST_TreiberStack \
     CPPUNIT_TEST( Treiber_HP        ) \
     CPPUNIT_TEST( Treiber_DHP_stat  )
 
 #define CDSUNIT_DECLARE_EliminationStack \
-    TEST_ELIMINATION( Elimination_HP, cds::intrusive::single_link::node< cds::gc::HP >        ) \
-    TEST_ELIMINATION( Elimination_HP_2ms, cds::intrusive::single_link::node< cds::gc::HP >    ) \
-    TEST_ELIMINATION( Elimination_HP_2ms_stat, cds::intrusive::single_link::node< cds::gc::HP >) \
-    TEST_ELIMINATION( Elimination_HP_5ms, cds::intrusive::single_link::node< cds::gc::HP >    ) \
-    TEST_ELIMINATION( Elimination_HP_5ms_stat, cds::intrusive::single_link::node< cds::gc::HP >) \
-    TEST_ELIMINATION( Elimination_HP_10ms, cds::intrusive::single_link::node< cds::gc::HP >    ) \
-    TEST_ELIMINATION( Elimination_HP_10ms_stat, cds::intrusive::single_link::node< cds::gc::HP >) \
-    TEST_ELIMINATION( Elimination_HP_seqcst, cds::intrusive::single_link::node< cds::gc::HP > ) \
-    /*TEST_ELIMINATION( Elimination_HP_yield, cds::intrusive::single_link::node< cds::gc::HP >  )*/ \
-    TEST_ELIMINATION( Elimination_HP_pause, cds::intrusive::single_link::node< cds::gc::HP >  ) \
-    TEST_ELIMINATION( Elimination_HP_exp, cds::intrusive::single_link::node< cds::gc::HP >    ) \
-    TEST_ELIMINATION( Elimination_HP_stat, cds::intrusive::single_link::node< cds::gc::HP >   ) \
-    TEST_ELIMINATION( Elimination_HP_dyn, cds::intrusive::single_link::node< cds::gc::HP >    ) \
-    TEST_ELIMINATION( Elimination_HP_dyn_stat, cds::intrusive::single_link::node< cds::gc::HP >) \
-    TEST_ELIMINATION( Elimination_DHP, cds::intrusive::single_link::node< cds::gc::DHP >       ) \
-    TEST_ELIMINATION( Elimination_DHP_2ms, cds::intrusive::single_link::node< cds::gc::DHP >    ) \
-    TEST_ELIMINATION( Elimination_DHP_2ms_stat, cds::intrusive::single_link::node< cds::gc::DHP >) \
-    TEST_ELIMINATION( Elimination_DHP_5ms, cds::intrusive::single_link::node< cds::gc::DHP >    ) \
-    TEST_ELIMINATION( Elimination_DHP_5ms_stat, cds::intrusive::single_link::node< cds::gc::DHP >) \
-    TEST_ELIMINATION( Elimination_DHP_10ms, cds::intrusive::single_link::node< cds::gc::DHP >    ) \
-    TEST_ELIMINATION( Elimination_DHP_10ms_stat, cds::intrusive::single_link::node< cds::gc::DHP >) \
-    /*TEST_ELIMINATION( Elimination_DHP_yield, cds::intrusive::single_link::node< cds::gc::DHP > )*/ \
-    TEST_ELIMINATION( Elimination_DHP_pause, cds::intrusive::single_link::node< cds::gc::DHP > ) \
-    TEST_ELIMINATION( Elimination_DHP_exp, cds::intrusive::single_link::node< cds::gc::DHP >   ) \
-    TEST_ELIMINATION( Elimination_DHP_stat, cds::intrusive::single_link::node< cds::gc::DHP >  ) \
-    TEST_ELIMINATION( Elimination_DHP_dyn, cds::intrusive::single_link::node< cds::gc::DHP >   ) \
-    TEST_ELIMINATION( Elimination_DHP_dyn_stat, cds::intrusive::single_link::node< cds::gc::DHP >)
+    TEST_ELIMINATION( Elimination_HP, cds::intrusive::treiber_stack::node< cds::gc::HP >        ) \
+    TEST_ELIMINATION( Elimination_HP_2ms, cds::intrusive::treiber_stack::node< cds::gc::HP >    ) \
+    TEST_ELIMINATION( Elimination_HP_2ms_stat, cds::intrusive::treiber_stack::node< cds::gc::HP >) \
+    TEST_ELIMINATION( Elimination_HP_5ms, cds::intrusive::treiber_stack::node< cds::gc::HP >    ) \
+    TEST_ELIMINATION( Elimination_HP_5ms_stat, cds::intrusive::treiber_stack::node< cds::gc::HP >) \
+    TEST_ELIMINATION( Elimination_HP_10ms, cds::intrusive::treiber_stack::node< cds::gc::HP >    ) \
+    TEST_ELIMINATION( Elimination_HP_10ms_stat, cds::intrusive::treiber_stack::node< cds::gc::HP >) \
+    TEST_ELIMINATION( Elimination_HP_seqcst, cds::intrusive::treiber_stack::node< cds::gc::HP > ) \
+    /*TEST_ELIMINATION( Elimination_HP_yield, cds::intrusive::treiber_stack::node< cds::gc::HP >  )*/ \
+    TEST_ELIMINATION( Elimination_HP_pause, cds::intrusive::treiber_stack::node< cds::gc::HP >  ) \
+    TEST_ELIMINATION( Elimination_HP_exp, cds::intrusive::treiber_stack::node< cds::gc::HP >    ) \
+    TEST_ELIMINATION( Elimination_HP_stat, cds::intrusive::treiber_stack::node< cds::gc::HP >   ) \
+    TEST_ELIMINATION( Elimination_HP_dyn, cds::intrusive::treiber_stack::node< cds::gc::HP >    ) \
+    TEST_ELIMINATION( Elimination_HP_dyn_stat, cds::intrusive::treiber_stack::node< cds::gc::HP >) \
+    TEST_ELIMINATION( Elimination_DHP, cds::intrusive::treiber_stack::node< cds::gc::DHP >       ) \
+    TEST_ELIMINATION( Elimination_DHP_2ms, cds::intrusive::treiber_stack::node< cds::gc::DHP >    ) \
+    TEST_ELIMINATION( Elimination_DHP_2ms_stat, cds::intrusive::treiber_stack::node< cds::gc::DHP >) \
+    TEST_ELIMINATION( Elimination_DHP_5ms, cds::intrusive::treiber_stack::node< cds::gc::DHP >    ) \
+    TEST_ELIMINATION( Elimination_DHP_5ms_stat, cds::intrusive::treiber_stack::node< cds::gc::DHP >) \
+    TEST_ELIMINATION( Elimination_DHP_10ms, cds::intrusive::treiber_stack::node< cds::gc::DHP >    ) \
+    TEST_ELIMINATION( Elimination_DHP_10ms_stat, cds::intrusive::treiber_stack::node< cds::gc::DHP >) \
+    TEST_ELIMINATION( Elimination_DHP_seqcst, cds::intrusive::treiber_stack::node< cds::gc::DHP > ) \
+    /*TEST_ELIMINATION( Elimination_DHP_yield, cds::intrusive::treiber_stack::node< cds::gc::DHP > )*/ \
+    TEST_ELIMINATION( Elimination_DHP_pause, cds::intrusive::treiber_stack::node< cds::gc::DHP > ) \
+    TEST_ELIMINATION( Elimination_DHP_exp, cds::intrusive::treiber_stack::node< cds::gc::DHP >   ) \
+    TEST_ELIMINATION( Elimination_DHP_stat, cds::intrusive::treiber_stack::node< cds::gc::DHP >  ) \
+    TEST_ELIMINATION( Elimination_DHP_dyn, cds::intrusive::treiber_stack::node< cds::gc::DHP >   ) \
+    TEST_ELIMINATION( Elimination_DHP_dyn_stat, cds::intrusive::treiber_stack::node< cds::gc::DHP >)
 
 #define CDSUNIT_TEST_EliminationStack \
     CPPUNIT_TEST( Elimination_HP        ) \
@@ -74,7 +75,8 @@
     CPPUNIT_TEST( Elimination_HP_stat   ) \
     CPPUNIT_TEST( Elimination_HP_dyn    ) \
     CPPUNIT_TEST( Elimination_HP_dyn_stat) \
-    CPPUNIT_TEST( Elimination_DHP       ) \
+    CPPUNIT_TEST( Elimination_DHP        ) \
+    CPPUNIT_TEST( Elimination_DHP_seqcst ) \
     CPPUNIT_TEST( Elimination_DHP_2ms    ) \
     CPPUNIT_TEST( Elimination_DHP_2ms_stat) \
     CPPUNIT_TEST( Elimination_DHP_5ms    ) \
index 2a32cb43b6d0f35a17113cf8261ad566add8a729..b65309469934adb8695ad842d5b3f36bee21b16d 100644 (file)
@@ -73,10 +73,10 @@ namespace istack {
         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T > Treiber_HP;
         struct traits_Treiber_DHP: public
             cds::intrusive::treiber_stack::make_traits <
-                cds::intrusive::opt::hook< base_hook<cds::gc::PTB> >
+                cds::intrusive::opt::hook< base_hook<cds::gc::DHP> >
             > ::type
         {};
-        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T, traits_Treiber_DHP >Treiber_PTB;
+        typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Treiber_DHP >Treiber_DHP;
 
         template <class GC> struct traits_Treiber_seqcst : public
             cds::intrusive::treiber_stack::make_traits <
@@ -140,6 +140,16 @@ namespace istack {
         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_on<cds::gc::HP>  > Elimination_HP;
         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_on<cds::gc::DHP> > Elimination_DHP;
 
+        template <class GC> struct traits_Elimination_seqcst : public
+            cds::intrusive::treiber_stack::make_traits <
+                cds::intrusive::opt::hook< base_hook<GC> >
+                , cds::opt::enable_elimination<true>
+                , cds::opt::memory_model< cds::opt::v::sequential_consistent >
+            > ::type
+        {};
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_seqcst<cds::gc::HP>  > Elimination_HP_seqcst;
+        typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_seqcst<cds::gc::DHP> > Elimination_DHP_seqcst;
+
         template <class GC> struct traits_Elimination_2ms: public
             cds::intrusive::treiber_stack::make_traits <
                 cds::intrusive::opt::hook< base_hook<GC> >
index 4aa4423a1bbbcc0f0b19a46d178ae31c58c930a7..0e05132a67b8c9e09612945e321c5fa3c02691a7 100644 (file)
@@ -192,7 +192,7 @@ namespace stack {
             > ::type
         {};
         typedef cds::container::TreiberStack< cds::gc::HP,  T, traits_Elimination_2ms >  Elimination_HP_2ms;
-        typedef cds::container::TreiberStack< cds::gc::DHP, T, traits_Elimination_2ms >  Elimination_HP_2ms;
+        typedef cds::container::TreiberStack< cds::gc::DHP, T, traits_Elimination_2ms >  Elimination_DHP_2ms;
 
         struct traits_Elimination_2ms_stat : public
             cds::container::treiber_stack::make_traits <
@@ -239,8 +239,8 @@ namespace stack {
                 , cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
             > ::type
         {};
-        typedef cds::container::TreiberStack< cds::gc::HP,  T, traits_Elimination_10ms_stat > Elimination_HP_10ms;
-        typedef cds::container::TreiberStack< cds::gc::DHP, T, traits_Elimination_10ms_stat > Elimination_DHP_10ms;
+        typedef cds::container::TreiberStack< cds::gc::HP,  T, traits_Elimination_10ms_stat > Elimination_HP_10ms_stat;
+        typedef cds::container::TreiberStack< cds::gc::DHP, T, traits_Elimination_10ms_stat > Elimination_DHP_10ms_stat;
 
         struct traits_Elimination_dyn: public
             cds::container::treiber_stack::make_traits <