From 8a05c794447f5898d8451f09c60e12dd8501fdb3 Mon Sep 17 00:00:00 2001 From: khizmax Date: Sat, 4 Jun 2016 10:44:29 +0300 Subject: [PATCH] Fixed MichaelList assertion --- cds/intrusive/impl/michael_list.h | 6 +++++- cds/intrusive/michael_list_nogc.h | 6 +++++- cds/intrusive/michael_list_rcu.h | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/cds/intrusive/impl/michael_list.h b/cds/intrusive/impl/michael_list.h index 63be7333..079996d4 100644 --- a/cds/intrusive/impl/michael_list.h +++ b/cds/intrusive/impl/michael_list.h @@ -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 ) diff --git a/cds/intrusive/michael_list_nogc.h b/cds/intrusive/michael_list_nogc.h index de48a4bf..06ac410d 100644 --- a/cds/intrusive/michael_list_nogc.h +++ b/cds/intrusive/michael_list_nogc.h @@ -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 diff --git a/cds/intrusive/michael_list_rcu.h b/cds/intrusive/michael_list_rcu.h index b19cf84a..c1635bd7 100644 --- a/cds/intrusive/michael_list_rcu.h +++ b/cds/intrusive/michael_list_rcu.h @@ -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 ) -- 2.34.1