From 32dc00891711676a9b0a92a312ad67176b2c109d Mon Sep 17 00:00:00 2001 From: khizmax Date: Sat, 13 Jun 2015 00:05:45 +0300 Subject: [PATCH] Fixed data race in flat combining algo found by TSan --- cds/algo/flat_combining.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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() ); -- 2.34.1