Fixed TSan warnings in SplitList
authorkhizmax <libcds.dev@gmail.com>
Tue, 28 Apr 2015 21:12:17 +0000 (00:12 +0300)
committerkhizmax <libcds.dev@gmail.com>
Tue, 28 Apr 2015 21:12:17 +0000 (00:12 +0300)
cds/compiler/feature_tsan.h
cds/container/split_list_set_rcu.h
cds/intrusive/details/split_list_base.h
cds/intrusive/impl/michael_list.h
cds/intrusive/split_list_rcu.h

index 926876adc8741ebbe19800ddded0d50487116b47..cecbadc519bc0f7e8d746f219128edf64ed86589 100644 (file)
@@ -7,8 +7,8 @@
 // From https://groups.google.com/d/msg/thread-sanitizer/SsrHB7FTnTk/mNTGNLQj-9cJ
 
 #ifdef CDS_THREAD_SANITIZER_ENABLED
-#   define CDS_TSAN_ANNOTATE_HAPPENS_BEFORE(addr)   AnnotateHappensBefore(__FILE__, __LINE__, (void*)(addr))\r
-#   define CDS_TSAN_ANNOTATE_HAPPENS_AFTER(addr)    AnnotateHappensAfter(__FILE__, __LINE__, (void*)(addr))\r
+#   define CDS_TSAN_ANNOTATE_HAPPENS_BEFORE(addr)   AnnotateHappensBefore(__FILE__, __LINE__, reinterpret_cast<void*>(addr))\r
+#   define CDS_TSAN_ANNOTATE_HAPPENS_AFTER(addr)    AnnotateHappensAfter(__FILE__, __LINE__, reinterpret_cast<void*>(addr))\r
 \r
 #   define CDS_TSAN_ANNOTATE_IGNORE_READS_BEGIN     AnnotateIgnoreReadsBegin(__FILE__, __LINE__)\r
 #   define CDS_TSAN_ANNOTATE_IGNORE_READS_END       AnnotateIgnoreReadsEnd(__FILE__, __LINE__)\r
index f6caeb73e052357101bd7605af7f044eb87acdb1..7ad24be8f32ecca1bf38c086b86e2941ea6ccc45 100644 (file)
@@ -226,18 +226,26 @@ namespace cds { namespace container {
         template <typename Q>
         static node_type * alloc_node( Q const& v )
         {
-            return cxx_node_allocator().New( v );
+            CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN;
+            node_type * p = cxx_node_allocator().New( v );
+            CDS_TSAN_ANNOTATE_IGNORE_WRITES_END;
+            return p;
         }
 
         template <typename... Args>
         static node_type * alloc_node( Args&&... args )
         {
-            return cxx_node_allocator().MoveNew( std::forward<Args>(args)...);
+            CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN;
+            node_type * p = cxx_node_allocator().MoveNew( std::forward<Args>(args)...);
+            CDS_TSAN_ANNOTATE_IGNORE_WRITES_END;
+            return p;
         }
 
         static void free_node( node_type * pNode )
         {
+            CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN;
             cxx_node_allocator().Delete( pNode );
+            CDS_TSAN_ANNOTATE_IGNORE_WRITES_END;
         }
 
         struct node_disposer {
index cddfb628bfc7aecede37bb11eaa4ac247bc7cda8..494ea3639c8cc02047cae12ce7ec716826f3b2e4 100644 (file)
@@ -711,10 +711,14 @@ namespace cds { namespace intrusive {
                     void operator()( value_type * v )
                     {
                         splitlist_node_type * p = static_cast<splitlist_node_type *>( node_traits::to_node_ptr( v ));
-                        if ( p->is_dummy() )
+                        if ( p->is_dummy() ) {
+                            CDS_TSAN_ANNOTATE_HAPPENS_BEFORE( p );
                             dummy_node_disposer<gc, typename traits::allocator>()( p );
-                        else
+                        }
+                        else {
+                            CDS_TSAN_ANNOTATE_HAPPENS_BEFORE( v );
                             native_disposer()( v );
+                        }
                     }
                 };
 
index bbe9b1341415050fe3e1bf053ade5bc5a7b8f320..b49bb64b2c676bb04dc5ac27e678e02fc06b79a3 100644 (file)
@@ -223,8 +223,10 @@ namespace cds { namespace intrusive {
         struct clean_disposer {
             void operator()( value_type * p )
             {
+                CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN;
                 michael_list::node_cleaner<gc, node_type, memory_model>()( node_traits::to_node_ptr( p ) );
                 disposer()( p );
+                CDS_TSAN_ANNOTATE_IGNORE_WRITES_END;
             }
         };
         //@endcond
@@ -1082,9 +1084,10 @@ try_again:
                     return false;
                 }
 
-                pNext = pCur->m_pNext.load(memory_model::memory_order_acquire);
+                pNext = pCur->m_pNext.load(memory_model::memory_order_relaxed);
+                CDS_TSAN_ANNOTATE_HAPPENS_AFTER( pNext.ptr() );
                 pos.guards.assign( position::guard_next_item, node_traits::to_value_ptr( pNext.ptr() ));
-                if ( pCur->m_pNext.load(memory_model::memory_order_relaxed).all() != pNext.all() ) {
+                if ( pCur->m_pNext.load(memory_model::memory_order_acquire).all() != pNext.all() ) {
                     bkoff();
                     goto try_again;
                 }
index 3ba404927bdfff5b99850752ebfbed13e295c2e7..0ef8a765b18614e5a666fe5c56771db9f8de5892 100644 (file)
@@ -255,11 +255,16 @@ namespace cds { namespace intrusive {
         dummy_node_type * alloc_dummy_node( size_t nHash )
         {
             m_Stat.onHeadNodeAllocated();
-            return dummy_node_allocator().New( nHash );
+            CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN;
+            dummy_node_type * p = dummy_node_allocator().New( nHash );
+            CDS_TSAN_ANNOTATE_IGNORE_WRITES_END;
+            return p;
         }
         void free_dummy_node( dummy_node_type * p )
         {
+            CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN;
             dummy_node_allocator().Delete( p );
+            CDS_TSAN_ANNOTATE_IGNORE_WRITES_END;
             m_Stat.onHeadNodeFreed();
         }