From fa70a4b390c1d5a133ecb711d4c7d3666c5a5890 Mon Sep 17 00:00:00 2001 From: khizmax Date: Thu, 4 Jun 2015 00:30:59 +0300 Subject: [PATCH] TSan: fixed MichaelList memory ordering constraints --- cds/intrusive/impl/michael_list.h | 13 +++++-------- cds/intrusive/michael_list_rcu.h | 2 +- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/cds/intrusive/impl/michael_list.h b/cds/intrusive/impl/michael_list.h index 97023f6d..a2b71414 100644 --- a/cds/intrusive/impl/michael_list.h +++ b/cds/intrusive/impl/michael_list.h @@ -1065,13 +1065,13 @@ namespace cds { namespace intrusive { back_off bkoff; -try_again: + try_again: pPrev = &refHead; pNext = nullptr; pCur = pPrev->load(memory_model::memory_order_acquire); pos.guards.assign( position::guard_current_item, node_traits::to_value_ptr( pCur.ptr() ) ); - if ( pPrev->load(memory_model::memory_order_relaxed) != pCur.ptr() ) + if ( pPrev->load(memory_model::memory_order_acquire) != pCur.ptr() ) goto try_again; while ( true ) { @@ -1084,12 +1084,9 @@ try_again: pNext = pCur->m_pNext.load(memory_model::memory_order_acquire); pos.guards.assign( position::guard_next_item, node_traits::to_value_ptr( pNext.ptr() )); - if ( pCur->m_pNext.load(memory_model::memory_order_relaxed).all() != pNext.all() ) { - bkoff(); - goto try_again; - } - - if ( pPrev->load(memory_model::memory_order_relaxed).all() != pCur.ptr() ) { + if ( pCur->m_pNext.load(memory_model::memory_order_acquire).all() != pNext.all() + || pPrev->load(memory_model::memory_order_acquire).all() != pCur.ptr() ) + { bkoff(); goto try_again; } diff --git a/cds/intrusive/michael_list_rcu.h b/cds/intrusive/michael_list_rcu.h index f8b59f51..59ee10ac 100644 --- a/cds/intrusive/michael_list_rcu.h +++ b/cds/intrusive/michael_list_rcu.h @@ -131,7 +131,7 @@ namespace cds { namespace intrusive { static void clear_links( node_type * pNode ) { - pNode->m_pNext.store( marked_node_ptr(), memory_model::memory_order_relaxed ); + pNode->m_pNext.store( marked_node_ptr(), memory_model::memory_order_release ); pNode->m_pDelChain = nullptr; } -- 2.34.1