TSan exam: fixed data races and false positives in queues
[libcds.git] / cds / intrusive / segmented_queue.h
index c8e1430dbe08f678f0bb4c4c32f967e58a3e6f57..b3f244c4ee91900a67c44c58798deeab0690c64b 100644 (file)
@@ -352,7 +352,7 @@ namespace cds { namespace intrusive {
                 m_Stat.onSegmentCreated();
 
                 if ( m_List.empty() )
-                    m_pHead.store( pNew, memory_model::memory_order_relaxed );
+                    m_pHead.store( pNew, memory_model::memory_order_release );
                 m_List.push_back( *pNew );
                 m_pTail.store( pNew, memory_model::memory_order_release );
                 return guard.assign( pNew );
@@ -411,13 +411,21 @@ namespace cds { namespace intrusive {
 
             segment * allocate_segment()
             {
-                return segment_allocator().NewBlock( sizeof(segment) + sizeof(cell) * m_nQuasiFactor,
+                // TSan: release barrier will be issued when the segment will link to the list of segments
+                CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN;
+                segment * p = segment_allocator().NewBlock( sizeof(segment) + sizeof(cell) * m_nQuasiFactor,
                     quasi_factor() );
+                CDS_TSAN_ANNOTATE_IGNORE_WRITES_END;
+                return p;
             }
 
             static void free_segment( segment * pSegment )
             {
+                // TSan: deallocating is called inside SMR reclamation cycle
+                // so necessary barriers have been already issued
+                CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN;
                 segment_allocator().Delete( pSegment );
+                CDS_TSAN_ANNOTATE_IGNORE_WRITES_END;
             }
 
             static void retire_segment( segment * pSegment )