From: khizmax Date: Mon, 17 Oct 2016 11:49:44 +0000 (+0300) Subject: IterableList: fixed memory ordering bugs found by TSan X-Git-Tag: v2.2.0~94 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=f3098ac6817350c00ced14c3f6533d1464e79175;p=libcds.git IterableList: fixed memory ordering bugs found by TSan --- diff --git a/cds/intrusive/details/iterable_list_base.h b/cds/intrusive/details/iterable_list_base.h index 07e6efde..26625717 100644 --- a/cds/intrusive/details/iterable_list_base.h +++ b/cds/intrusive/details/iterable_list_base.h @@ -57,14 +57,16 @@ namespace cds { namespace intrusive { //@cond node() - : next( nullptr ) - , data( nullptr ) - {} + { + next.store( nullptr, atomics::memory_order_release ); + data.store( marked_data_ptr(), atomics::memory_order_release ); + } node( value_type * pVal ) - : next( nullptr ) - , data( pVal ) - {} + { + next.store( nullptr, atomics::memory_order_release ); + data.store( marked_data_ptr( pVal ), atomics::memory_order_release ); + } //@endcond }; diff --git a/cds/intrusive/impl/iterable_list.h b/cds/intrusive/impl/iterable_list.h index 54fb2c9c..fc5fb14a 100644 --- a/cds/intrusive/impl/iterable_list.h +++ b/cds/intrusive/impl/iterable_list.h @@ -1096,7 +1096,7 @@ namespace cds { namespace intrusive { while ( true ) { node_type * pCur = pPrev->next.load( memory_model::memory_order_relaxed ); - if ( pCur == pCur->next.load( memory_model::memory_order_relaxed )) { + if ( pCur == pCur->next.load( memory_model::memory_order_acquire )) { // end-of-list pos.pPrev = pPrev; pos.pCur = pCur; @@ -1134,7 +1134,7 @@ namespace cds { namespace intrusive { while ( true ) { node_type * pCur = pPrev->next.load( memory_model::memory_order_relaxed ); - if ( pCur == pCur->next.load( memory_model::memory_order_relaxed ) ) { + if ( pCur == pCur->next.load( memory_model::memory_order_acquire )) { // end-of-list pos.pPrev = pPrev; pos.pCur = pCur;