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 630b2ae3a89e2d10a59469f9907ed8ee50cba127..bde6908334dd43d693ff2f738d563f08fd2b36b4 100644 (file)
@@ -261,6 +261,7 @@ namespace cds { namespace intrusive {
             assert( pRec );
 
             // this function is called under FC mutex, so switch TSan off
             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() ) {
             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
         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;
             CDS_TSAN_ANNOTATE_IGNORE_RW_BEGIN;
 
             typedef typename fc_kernel::iterator fc_iterator;
index aba66db3abe21f52669c407e832ee58ae960a647..5277c4c056e5ebb67c2521512c75576d8d8dae15 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
 
             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
         };
 
         //@cond
index b5ad38c48f5e01b86e3f1dca14ad25c5f3ac1438..f927113f75b04a30a3da859b4c43b2a551610821 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;
                 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;
                     if ( m_Queue.push( *p )) {
                         ++p;
                         ++i;
@@ -170,6 +171,7 @@ namespace queue {
                     if ( p ) {
                         p->nConsumer = m_nThreadNo;
                         ++m_nPopped;
                     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
                         if ( p->nWriterNo < nTotalWriters )
                             m_WriterData[ p->nWriterNo ].push_back( p->nNo );
                         else
index 9f5e15653e6c8fac6e1e7643630efbc0d987fcad..f46e16d8698fe7f532e77c7f426924514875d414 100644 (file)
@@ -6,3 +6,5 @@ race:cds::gc::details::retired_ptr::free
 
 # uRCU false positive
 race:cds::urcu::gc*::batch_retire*
 
 # uRCU false positive
 race:cds::urcu::gc*::batch_retire*
+
+race:cds::container::OptimisticQueue*::alloc_node