//$$CDS-header$$
-#ifndef __CDS_ALGO_FLAT_COMBINING_H
-#define __CDS_ALGO_FLAT_COMBINING_H
+#ifndef CDSLIB_ALGO_FLAT_COMBINING_H
+#define CDSLIB_ALGO_FLAT_COMBINING_H
#include <mutex>
#include <cds/algo/atomic.h>
struct publication_record {
atomics::atomic<unsigned int> nRequest; ///< Request field (depends on data structure)
atomics::atomic<unsigned int> nState; ///< Record state: inactive, active, removed
- unsigned int nAge; ///< Age of the record
+ atomics::atomic<unsigned int> nAge; ///< Age of the record
atomics::atomic<publication_record *> pNext; ///< Next record in publication list
void * pOwner; ///< [internal data] Pointer to \ref kernel object that manages the publication list
void release_record( publication_record_type * pRec )
{
assert( pRec->is_done() );
- pRec->nRequest.store( req_EmptyRecord, memory_model::memory_order_relaxed );
+ pRec->nRequest.store( req_EmptyRecord, memory_model::memory_order_release );
m_Stat.onReleasePubRecord();
}
{
assert( pRec->nState.load( memory_model::memory_order_relaxed ) == inactive );
- pRec->nAge = m_nCount;
+ pRec->nAge.store( m_nCount, memory_model::memory_order_release );
pRec->nState.store( active, memory_model::memory_order_release );
// Insert record to publication list
switch ( p->nState.load( memory_model::memory_order_acquire )) {
case active:
if ( p->op() >= req_Operation ) {
- p->nAge = nCurAge;
+ p->nAge.store( nCurAge, memory_model::memory_order_release );
owner.fc_apply( static_cast<publication_record_type *>(p) );
operation_done( *p );
bOpDone = true;
// Thinning publication list
publication_record * pPrev = nullptr;
for ( publication_record * p = m_pHead; p; ) {
- if ( p->nState.load( memory_model::memory_order_acquire ) == active && p->nAge + m_nCompactFactor < nCurAge ) {
+ if ( p->nState.load( memory_model::memory_order_acquire ) == active
+ && p->nAge.load( memory_model::memory_order_acquire ) + m_nCompactFactor < nCurAge )
+ {
if ( pPrev ) {
publication_record * pNext = p->pNext.load( memory_model::memory_order_acquire );
if ( pPrev->pNext.compare_exchange_strong( p, pNext,
} // namespace flat_combining
}} // namespace cds::algo
-#endif // #ifndef __CDS_ALGO_FLAT_COMBINING_H
+#endif // #ifndef CDSLIB_ALGO_FLAT_COMBINING_H