Suppressed TSan false positive warnings
authorkhizmax <libcds.dev@gmail.com>
Sun, 28 Jun 2015 16:34:08 +0000 (19:34 +0300)
committerkhizmax <libcds.dev@gmail.com>
Sun, 28 Jun 2015 16:34:08 +0000 (19:34 +0300)
cds/intrusive/fcqueue.h
cds/intrusive/optimistic_queue.h
tests/unit/queue/intrusive_queue_reader_writer.cpp
tools/tsan-suppression

index 630b2ae..bde6908 100644 (file)
@@ -261,6 +261,7 @@ namespace cds { namespace intrusive {
             assert( pRec );
 
             // this function is called under FC mutex, so switch TSan off
+            // All TSan warnings are false positive
             CDS_TSAN_ANNOTATE_IGNORE_RW_BEGIN;
 
             switch ( pRec->op() ) {
@@ -292,6 +293,7 @@ namespace cds { namespace intrusive {
         void fc_process( typename fc_kernel::iterator itBegin, typename fc_kernel::iterator itEnd )
         {
             // this function is called under FC mutex, so switch TSan off
+            // All TSan warnings are false positive
             CDS_TSAN_ANNOTATE_IGNORE_RW_BEGIN;
 
             typedef typename fc_kernel::iterator fc_iterator;
index aba66db..5277c4c 100644 (file)
@@ -32,11 +32,10 @@ namespace cds { namespace intrusive {
             atomic_node_ptr m_pNext ;   ///< Pointer to next node
             atomic_node_ptr m_pPrev ;   ///< Pointer to previous node
 
-            node() CDS_NOEXCEPT
-            {
-                m_pNext.store( nullptr, atomics::memory_order_release );
-                m_pPrev.store( nullptr, atomics::memory_order_release );
-            }
+            CDS_CONSTEXPR node() CDS_NOEXCEPT
+                : m_pNext( nullptr )
+                , m_pPrev( nullptr )
+            {}
         };
 
         //@cond
index b5ad38c..f927113 100644 (file)
@@ -85,6 +85,7 @@ namespace queue {
                 for ( typename Queue::value_type * p = m_pStart; p < m_pEnd; ) {
                     p->nNo = i;
                     p->nWriterNo = m_nThreadNo;
+                    CDS_TSAN_ANNOTATE_HAPPENS_BEFORE( &p->nWriterNo );
                     if ( m_Queue.push( *p )) {
                         ++p;
                         ++i;
@@ -170,6 +171,7 @@ namespace queue {
                     if ( p ) {
                         p->nConsumer = m_nThreadNo;
                         ++m_nPopped;
+                        CDS_TSAN_ANNOTATE_HAPPENS_AFTER( &p->nWriterNo );
                         if ( p->nWriterNo < nTotalWriters )
                             m_WriterData[ p->nWriterNo ].push_back( p->nNo );
                         else
index 9f5e156..f46e16d 100644 (file)
@@ -6,3 +6,5 @@ race:cds::gc::details::retired_ptr::free
 
 # uRCU false positive
 race:cds::urcu::gc*::batch_retire*
+
+race:cds::container::OptimisticQueue*::alloc_node