X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=cds%2Fintrusive%2Fskip_list_rcu.h;h=b153aa809558155d17c1f1d7c51c2a7a3b95475a;hb=51494783145ce52907dcb85e362629830ba46a97;hp=1d3a9774a1c43a0ecc8c7f623210a6974348da44;hpb=2bb66f1d159d044d2c5dad0f0f968abcb6d53287;p=libcds.git diff --git a/cds/intrusive/skip_list_rcu.h b/cds/intrusive/skip_list_rcu.h index 1d3a9774..b153aa80 100644 --- a/cds/intrusive/skip_list_rcu.h +++ b/cds/intrusive/skip_list_rcu.h @@ -71,13 +71,14 @@ namespace cds { namespace intrusive { public: /// Constructs a node of height 1 (a bottom-list node) - CDS_CONSTEXPR node() + node() : m_pNext( nullptr ) , m_pDelChain( nullptr ) , m_nHeight(1) , m_arrNext( nullptr ) - , m_nUnlink(1) - {} + { + m_nUnlink.store( 1, atomics::memory_order_release ); + } /// Constructs a node of height \p nHeight void make_tower( unsigned int nHeight, atomic_marked_ptr * nextTower ) @@ -117,15 +118,7 @@ namespace cds { namespace intrusive { assert( nLevel < height()); assert( nLevel == 0 || (nLevel > 0 && m_arrNext != nullptr)); -# ifdef CDS_THREAD_SANITIZER_ENABLED - // TSan false positive: m_arrNext is read-only array - CDS_TSAN_ANNOTATE_IGNORE_READS_BEGIN; - atomic_marked_ptr& r = nLevel ? m_arrNext[ nLevel - 1] : m_pNext; - CDS_TSAN_ANNOTATE_IGNORE_READS_END; - return r; -# else return nLevel ? m_arrNext[ nLevel - 1] : m_pNext; -# endif } /// Access to element of next pointer array (const version) @@ -134,15 +127,7 @@ namespace cds { namespace intrusive { assert( nLevel < height()); assert( nLevel == 0 || nLevel > 0 && m_arrNext != nullptr ); -# ifdef CDS_THREAD_SANITIZER_ENABLED - // TSan false positive: m_arrNext is read-only array - CDS_TSAN_ANNOTATE_IGNORE_READS_BEGIN; - atomic_marked_ptr& r = nLevel ? m_arrNext[ nLevel - 1] : m_pNext; - CDS_TSAN_ANNOTATE_IGNORE_READS_END; - return r; -# else return nLevel ? m_arrNext[ nLevel - 1] : m_pNext; -# endif } /// Access to element of next pointer array (same as \ref next function) @@ -647,10 +632,10 @@ namespace cds { namespace intrusive { protected: skip_list::details::head_node< node_type > m_Head; ///< head tower (max height) - item_counter m_ItemCounter; ///< item counter random_level_generator m_RandomLevelGen; ///< random level generator instance atomics::atomic m_nHeight; ///< estimated high level atomics::atomic m_pDeferredDelChain ; ///< Deferred deleted node chain + item_counter m_ItemCounter; ///< item counter mutable stat m_Stat; ///< internal statistics protected: