Fixed refactoring bugs
authorkhizmax <libcds.dev@gmail.com>
Sat, 23 May 2015 15:12:56 +0000 (18:12 +0300)
committerkhizmax <libcds.dev@gmail.com>
Sat, 23 May 2015 15:12:56 +0000 (18:12 +0300)
cds/intrusive/details/michael_list_base.h
cds/intrusive/michael_list_rcu.h
cds/urcu/raw_ptr.h

index bcafce1ee6a7dc919677f39e63380cbc8826637b..c7e3e264f13ba7d833785642ead55d8e239adeda 100644 (file)
@@ -28,8 +28,8 @@ namespace cds { namespace intrusive {
             typedef GC              gc  ;   ///< Garbage collector
             typedef Tag             tag ;   ///< tag
 
-            typedef cds::details::marked_ptr<node, 1>   marked_ptr         ;   ///< marked pointer
-            typedef typename gc::template atomic_marked_ptr< marked_ptr>     atomic_marked_ptr   ;   ///< atomic marked pointer specific for GC
+            typedef cds::details::marked_ptr<node, 1>   marked_ptr;   ///< marked pointer
+            typedef typename gc::template atomic_marked_ptr<marked_ptr> atomic_marked_ptr;   ///< atomic marked pointer specific for GC
 
             atomic_marked_ptr m_pNext ; ///< pointer to the next node in the container
 
index e3473d2bdfe1c1e3b1bdaaa45f5dc6dd2b0651f0..577485b2aebb12ed285cf3ea79f64e32695c9e1f 100644 (file)
@@ -22,10 +22,10 @@ namespace cds { namespace intrusive {
             typedef cds::urcu::gc< RCU > gc;   ///< Garbage collector
             typedef Tag                  tag;  ///< tag
 
-            typedef cds::details::marked_ptr<node, 1>   marked_ptr         ;   ///< marked pointer
-            typedef typename gc::template atomic_marked_ptr< marked_ptr>     atomic_marked_ptr   ;   ///< atomic marked pointer specific for GC
+            typedef cds::details::marked_ptr<node, 3>   marked_ptr; ///< marked pointer
+            typedef typename gc::template atomic_marked_ptr<marked_ptr> atomic_marked_ptr; ///< atomic marked pointer specific for GC
 
-            atomic_marked_ptr m_pNext ; ///< pointer to the next node in the container
+            atomic_marked_ptr m_pNext; ///< pointer to the next node in the container
             node *            m_pDelChain; ///< Deleted node chain (local for a thread)
 
             CDS_CONSTEXPR node() CDS_NOEXCEPT
@@ -158,8 +158,11 @@ namespace cds { namespace intrusive {
 
                 auto f = [&pChain]() -> cds::urcu::retired_ptr {
                     node_type * p = pChain;
-                    pChain = p->m_pDelChain;
-                    return cds::urcu::make_retired_ptr<clear_and_dispose>( node_traits::to_value_ptr( p ));
+                    if ( p ) {
+                        pChain = p->m_pDelChain;
+                        return cds::urcu::make_retired_ptr<clear_and_dispose>( node_traits::to_value_ptr( p ));
+                    }
+                    return cds::urcu::make_retired_ptr<clear_and_dispose>( static_cast<value_type *>(nullptr));
                 };
                 gc::batch_retire(std::ref(f));
             }
@@ -222,6 +225,7 @@ namespace cds { namespace intrusive {
             void apply()
             {
                 if ( pReclaimedChain ) {
+                    assert( !gc::is_locked());
                     dispose_chain( pReclaimedChain );
                     pReclaimedChain = nullptr;
                 }
index ea8f98eb8ec3ef013197a08e097c5829dfc038c4..c4d0f1c1342f187ee0035b4581edad30b56a880e 100644 (file)
@@ -164,7 +164,6 @@ namespace cds { namespace urcu {
         */
         void release()
         {
-            assert( !rcu::is_locked() );
             m_Enum.apply();
             m_ptr = nullptr;
         }