Fixed MichaelList assertion
authorkhizmax <libcds.dev@gmail.com>
Sat, 4 Jun 2016 07:44:29 +0000 (10:44 +0300)
committerkhizmax <libcds.dev@gmail.com>
Sat, 4 Jun 2016 07:44:29 +0000 (10:44 +0300)
cds/intrusive/impl/michael_list.h
cds/intrusive/michael_list_nogc.h
cds/intrusive/michael_list_rcu.h

index 63be73333fefc460b87f57b39fad5d24fccfa6c0..079996d4af20b0677756d7d25a9fb2637a62f2c5 100644 (file)
@@ -274,7 +274,11 @@ namespace cds { namespace intrusive {
 
             marked_node_ptr cur(pos.pCur);
             pNode->m_pNext.store( cur, memory_model::memory_order_release );
-            return pos.pPrev->compare_exchange_strong( cur, marked_node_ptr(pNode), memory_model::memory_order_release, atomics::memory_order_relaxed );
+            if ( pos.pPrev->compare_exchange_strong( cur, marked_node_ptr(pNode), memory_model::memory_order_release, atomics::memory_order_relaxed ))
+                return true;
+
+            pNode->m_pNext.store( marked_node_ptr(), memory_model::memory_order_relaxed );
+            return false;
         }
 
         static bool unlink_node( position& pos )
index de48a4bf4fb09acf3b4c431e38bac3000fadf3d5..06ac410dc43773c70ad554508666be8eae4d80e3 100644 (file)
@@ -154,7 +154,11 @@ namespace cds { namespace intrusive {
             link_checker::is_empty( pNode );
 
             pNode->m_pNext.store( pos.pCur, memory_model::memory_order_relaxed );
-            return pos.pPrev->compare_exchange_strong( pos.pCur, pNode, memory_model::memory_order_release, atomics::memory_order_relaxed );
+            if ( pos.pPrev->compare_exchange_strong( pos.pCur, pNode, memory_model::memory_order_release, atomics::memory_order_relaxed ))
+                return true;
+
+            pNode->m_pNext.store( nullptr, memory_model::memory_order_relaxed );
+            return false;
         }
         //@endcond
 
index b19cf84a2f0d12e1af5280089ca5fb61eb47aff2..c1635bd740e690031c8ce908fdf54050e0ded787 100644 (file)
@@ -247,7 +247,11 @@ namespace cds { namespace intrusive {
 
             marked_node_ptr p( pos.pCur );
             pNode->m_pNext.store( p, memory_model::memory_order_release );
-            return pos.pPrev->compare_exchange_strong( p, marked_node_ptr(pNode), memory_model::memory_order_release, atomics::memory_order_relaxed );
+            if ( pos.pPrev->compare_exchange_strong( p, marked_node_ptr(pNode), memory_model::memory_order_release, atomics::memory_order_relaxed ))
+                return true;
+
+            pNode->m_pNext.store( marked_node_ptr(), memory_model::memory_order_relaxed );
+            return false;
         }
 
         static void link_to_remove_chain( position& pos, node_type * pDel )