From: khizmax Date: Tue, 27 Dec 2016 15:34:06 +0000 (+0300) Subject: FlatCombining: fixed a race X-Git-Tag: v2.2.0~14 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=libcds.git;a=commitdiff_plain;h=df03ab96051e74f75c170e471d4959128ea1f639 FlatCombining: fixed a race --- diff --git a/cds/algo/flat_combining/kernel.h b/cds/algo/flat_combining/kernel.h index b0d8db43..654992d6 100644 --- a/cds/algo/flat_combining/kernel.h +++ b/cds/algo/flat_combining/kernel.h @@ -298,6 +298,7 @@ namespace cds { namespace algo { publication_record * pRec = p; p = p->pNext.load( memory_model::memory_order_relaxed ); free_publication_record( static_cast( pRec )); + m_Stat.onDeletePubRecord(); } } @@ -714,9 +715,12 @@ namespace cds { namespace algo { assert( p == m_pHead ); break; case removed: - // The record should be removed - p = unlink_and_delete_record( pPrev, p ); - continue; + // The record should be removed (except m_pHead) + if ( pPrev ) { + p = unlink_and_delete_record( pPrev, p ); + continue; + } + break; default: /// ??? That is impossible assert(false); @@ -807,22 +811,18 @@ namespace cds { namespace algo { publication_record * unlink_and_delete_record( publication_record * pPrev, publication_record * p ) { - if ( pPrev ) { - publication_record * pNext = p->pNext.load( memory_model::memory_order_acquire ); - if ( pPrev->pNext.compare_exchange_strong( p, pNext, - memory_model::memory_order_acquire, atomics::memory_order_relaxed )) - { - free_publication_record( static_cast( p )); - m_Stat.onDeletePubRecord(); - } - return pNext; - } - else { - m_pHead = static_cast( p->pNext.load( memory_model::memory_order_acquire )); + // m_pHead is persistent node and cannot be deleted + assert( pPrev != nullptr ); + assert( p != m_pHead ); + + publication_record * pNext = p->pNext.load( memory_model::memory_order_acquire ); + if ( pPrev->pNext.compare_exchange_strong( p, pNext, + memory_model::memory_order_acquire, atomics::memory_order_relaxed )) + { free_publication_record( static_cast( p )); m_Stat.onDeletePubRecord(); - return m_pHead; } + return pNext; } //@endcond };