[TSan] Fixed data race: added compiler barriers, tuned memory ordering
[libcds.git] / cds / gc / details / hp.h
index cfd68b9348a6b2f9101faf09283483617a43e765..84c7702051d2fa982e919cc4e5a7c12fc12534f0 100644 (file)
@@ -112,7 +112,7 @@ namespace cds {
                 typedef retired_vector_impl::iterator  iterator;
 
                 /// Constructor
-                retired_vector( const cds::gc::hp::GarbageCollector& HzpMgr ); // inline
+                explicit retired_vector( const cds::gc::hp::GarbageCollector& HzpMgr ); // inline
                 ~retired_vector()
                 {}
 
@@ -185,7 +185,7 @@ namespace cds {
                 char padding2[cds::c_nCacheLineSize];
 
                 /// Ctor
-                hp_record( const cds::gc::hp::GarbageCollector& HzpMgr ); // inline
+                explicit hp_record( const cds::gc::hp::GarbageCollector& HzpMgr ); // inline
                 ~hp_record()
                 {}
 
@@ -294,16 +294,23 @@ namespace cds {
             {
                 hplist_node *                    m_pNextNode; ///< next hazard ptr record in list
                 atomics::atomic<OS::ThreadId>    m_idOwner;   ///< Owner thread id; 0 - the record is free (not owned)
-                atomics::atomic<bool>            m_bFree;     ///< true if record if free (not owned)
+                atomics::atomic<bool>            m_bFree;     ///< true if record is free (not owned)
 
                 //@cond
-                hplist_node( const GarbageCollector& HzpMgr )
+                explicit hplist_node( const GarbageCollector& HzpMgr )
                     : hp_record( HzpMgr ),
                     m_pNextNode( nullptr ),
                     m_idOwner( OS::c_NullThreadId ),
                     m_bFree( true )
                 {}
 
+                hplist_node( const GarbageCollector& HzpMgr, OS::ThreadId owner )
+                    : hp_record( HzpMgr ),
+                    m_pNextNode( nullptr ),
+                    m_idOwner( owner ),
+                    m_bFree( false )
+                {}
+
                 ~hplist_node()
                 {
                     assert( m_idOwner.load( atomics::memory_order_relaxed ) == OS::c_NullThreadId );
@@ -338,7 +345,7 @@ namespace cds {
             ~GarbageCollector();
 
             /// Allocate new HP record
-            hplist_node * NewHPRec();
+            hplist_node * NewHPRec( OS::ThreadId owner );
 
             /// Permanently deletes HPrecord \p pNode
             /**