//@endcond
protected:
- unsigned int m_nCount; ///< Count of combining passes
+ atomics::atomic<unsigned int> 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
{
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
// 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 ))
// 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() );