From: khizmax Date: Mon, 10 Apr 2017 20:28:49 +0000 (+0300) Subject: [TSan] Fixed memory order constraints X-Git-Tag: v2.3.0~81 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d23638cd05b9a97bb3656266375660b943cf497d;p=libcds.git [TSan] Fixed memory order constraints --- diff --git a/cds/algo/flat_combining/defs.h b/cds/algo/flat_combining/defs.h index 35e04ed7..14608cad 100644 --- a/cds/algo/flat_combining/defs.h +++ b/cds/algo/flat_combining/defs.h @@ -66,11 +66,12 @@ namespace cds { namespace algo { namespace flat_combining { /// Initializes publication record publication_record() : nRequest( req_EmptyRecord ) - , nState( inactive ) , nAge( 0 ) , pNext( nullptr ) , pNextAllocated( nullptr ) - {} + { + nState.store( inactive, atomics::memory_order_release ); + } /// Returns the value of \p nRequest field unsigned int op( atomics::memory_order mo = atomics::memory_order_relaxed ) const diff --git a/cds/algo/flat_combining/kernel.h b/cds/algo/flat_combining/kernel.h index c4c2ce23..30dcc7dc 100644 --- a/cds/algo/flat_combining/kernel.h +++ b/cds/algo/flat_combining/kernel.h @@ -324,9 +324,9 @@ namespace cds { namespace algo { // Insert in allocated list assert( m_pAllocatedHead != nullptr ); - publication_record* p = m_pAllocatedHead->pNextAllocated.load( memory_model::memory_order_acquire ); + publication_record* p = m_pAllocatedHead->pNextAllocated.load( memory_model::memory_order_relaxed ); do { - pRec->pNextAllocated.store( p, memory_model::memory_order_relaxed ); + pRec->pNextAllocated.store( p, memory_model::memory_order_release ); } while ( !m_pAllocatedHead->pNextAllocated.compare_exchange_weak( p, pRec, memory_model::memory_order_release, atomics::memory_order_acquire )); publish( pRec ); @@ -602,10 +602,10 @@ namespace cds { namespace algo { // Insert record to publication list if ( m_pHead != static_cast(pRec)) { - publication_record * p = m_pHead->pNext.load(memory_model::memory_order_relaxed); + publication_record * p = m_pHead->pNext.load( memory_model::memory_order_relaxed ); if ( p != static_cast( pRec )) { do { - pRec->pNext.store( p, memory_model::memory_order_relaxed ); + pRec->pNext.store( p, memory_model::memory_order_release ); // Failed CAS changes p } while ( !m_pHead->pNext.compare_exchange_weak( p, static_cast(pRec), memory_model::memory_order_release, atomics::memory_order_acquire ));