From: khizmax Date: Fri, 12 Jun 2015 21:05:45 +0000 (+0300) Subject: Fixed data race in flat combining algo found by TSan X-Git-Tag: v2.1.0~202 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=32dc00891711676a9b0a92a312ad67176b2c109d;p=libcds.git Fixed data race in flat combining algo found by TSan --- diff --git a/cds/algo/flat_combining.h b/cds/algo/flat_combining.h index b239ef42..0f382d40 100644 --- a/cds/algo/flat_combining.h +++ b/cds/algo/flat_combining.h @@ -262,7 +262,7 @@ namespace cds { namespace algo { //@endcond protected: - unsigned int m_nCount; ///< Count of combining passes + atomics::atomic m_nCount; ///< Total count of combining passes. Used as an age. publication_record_type * m_pHead; ///< Head of publication list boost::thread_specific_ptr< publication_record_type > m_pThreadRec; ///< Thread-local publication record mutable global_lock_type m_Mutex; ///< Global mutex @@ -565,7 +565,7 @@ namespace cds { namespace algo { { assert( pRec->nState.load( memory_model::memory_order_relaxed ) == inactive ); - pRec->nAge.store( m_nCount, memory_model::memory_order_release ); + pRec->nAge.store( m_nCount.load(memory_model::memory_order_acquire), memory_model::memory_order_release ); pRec->nState.store( active, memory_model::memory_order_release ); // Insert record to publication list @@ -652,7 +652,7 @@ namespace cds { namespace algo { // The thread is a combiner assert( !m_Mutex.try_lock() ); - unsigned int const nCurAge = ++m_nCount; + unsigned int const nCurAge = m_nCount.fetch_add( 1, memory_model::memory_order_release ) + 1; for ( unsigned int nPass = 0; nPass < m_nCombinePassCount; ++nPass ) if ( !combining_pass( owner, nCurAge )) @@ -703,7 +703,7 @@ namespace cds { namespace algo { // The thread is a combiner assert( !m_Mutex.try_lock() ); - unsigned int const nCurAge = ++m_nCount; + unsigned int const nCurAge = m_nCount.fetch_add( 1, memory_model::memory_order_release ) + 1; for ( unsigned int nPass = 0; nPass < m_nCombinePassCount; ++nPass ) owner.fc_process( begin(), end() );