From f3098ac6817350c00ced14c3f6533d1464e79175 Mon Sep 17 00:00:00 2001 From: khizmax Date: Mon, 17 Oct 2016 14:49:44 +0300 Subject: [PATCH] IterableList: fixed memory ordering bugs found by TSan --- cds/intrusive/details/iterable_list_base.h | 14 ++++++++------ cds/intrusive/impl/iterable_list.h | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) 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; -- 2.34.1