TSan exam:
[libcds.git] / cds / intrusive / impl / ellen_bintree.h
index a6fcd1a216099fd8e5d4903efe8d5547be436e0b..a3ae991bb8e92ae3078ff81ba9ea8a3e4f6f8afd 100644 (file)
@@ -1236,7 +1236,10 @@ namespace cds { namespace intrusive {
                     if ( res.pGrandParent ) {
                         assert( !res.pLeaf->infinite_key() );
                         pNewInternal->infinite_key( 0 );
+                        // TSan false positive: there is the release fence below, pNewInternal is not linked yet
+                        CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN;
                         key_extractor()(pNewInternal->m_Key, *node_traits::to_value_ptr( res.pLeaf ));
+                        CDS_TSAN_ANNOTATE_IGNORE_WRITES_END;
                     }
                     else {
                         assert( res.pLeaf->infinite_key() == tree_node::key_infinite1 );
@@ -1249,7 +1252,10 @@ namespace cds { namespace intrusive {
                     assert( !res.pLeaf->is_internal() );
                     pNewInternal->infinite_key( 0 );
 
+                    // TSan false positive: there is the release fence below, pNewInternal is not linked yet
+                    CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN;
                     key_extractor()(pNewInternal->m_Key, val);
+                    CDS_TSAN_ANNOTATE_IGNORE_WRITES_END;
                     pNewInternal->m_pLeft.store( static_cast<tree_node *>(res.pLeaf), memory_model::memory_order_relaxed );
                     pNewInternal->m_pRight.store( static_cast<tree_node *>(pNewLeaf), memory_model::memory_order_release );
                     assert( !res.pLeaf->infinite_key() );