From: khizmax Date: Wed, 3 Jun 2015 21:30:59 +0000 (+0300) Subject: TSan: fixed MichaelList memory ordering constraints X-Git-Tag: v2.1.0~215 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=libcds.git;a=commitdiff_plain;h=fa70a4b390c1d5a133ecb711d4c7d3666c5a5890 TSan: fixed MichaelList memory ordering constraints --- 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; }