Fixed memory ordering (by TSan reports)
authorkhizmax <libcds.dev@gmail.com>
Mon, 17 Apr 2017 19:34:50 +0000 (22:34 +0300)
committerkhizmax <libcds.dev@gmail.com>
Mon, 17 Apr 2017 19:34:50 +0000 (22:34 +0300)
cds/intrusive/details/ellen_bintree_base.h
cds/intrusive/ellen_bintree_rcu.h
cds/intrusive/impl/ellen_bintree.h

index 39b03cc0ac30f7fced9ebfdda896308abec6f3df..75c6da8a103d23d4cdbaa45eea7e78e09bdc3e65 100644 (file)
@@ -119,8 +119,9 @@ namespace cds { namespace intrusive {
 
             /// Constructs leaf (bIntrenal == false) or internal (bInternal == true) node
             explicit basic_node( bool bInternal )
-                : m_nFlags( bInternal ? internal : 0 )
-            {}
+            {
+                m_nFlags.store( bInternal ? internal: 0, atomics::memory_order_release );
+            }
 
             /// Checks if the node is a leaf
             bool is_leaf() const
@@ -168,6 +169,7 @@ namespace cds { namespace intrusive {
             typedef basic_node base_class;
 
             typedef GC              gc       ;   ///< Garbage collector
+
             /// Constructs leaf (bIntrenal == false) or internal (bInternal == true) node
             explicit base_node( bool bInternal )
                 : base_class( bInternal )
@@ -241,8 +243,9 @@ namespace cds { namespace intrusive {
                 , m_pLeft( nullptr )
                 , m_pRight( nullptr )
                 , m_pUpdate( update_ptr())
-                , m_nEmptyUpdate(0)
-            {}
+            {
+                m_nEmptyUpdate.store( 0, atomics::memory_order_release );
+            }
 
             //@cond
             update_ptr null_update_desc()
index b948cc8ef2e1d3e62dc7f227bd7d6fa9214776e6..5d7ec110ab71f656f683cae23cb2831638ca4056 100644 (file)
@@ -53,7 +53,7 @@ namespace cds { namespace intrusive {
 
             /// Constructs leaf (bIntrenal == false) or internal (bInternal == true) node
             explicit base_node( bool bInternal )
-                : basic_node( bInternal ? internal : 0 )
+                : basic_node( bInternal )
                 , m_pNextRetired( nullptr )
             {}
         };
@@ -1395,16 +1395,16 @@ namespace cds { namespace intrusive {
             tree_node * pLeaf = static_cast<tree_node *>( pOp->iInfo.pLeaf );
             if ( pOp->iInfo.bRightLeaf ) {
                 pOp->iInfo.pParent->m_pRight.compare_exchange_strong( pLeaf, static_cast<tree_node *>( pOp->iInfo.pNew ),
-                    memory_model::memory_order_relaxed, atomics::memory_order_relaxed );
+                    memory_model::memory_order_release, atomics::memory_order_relaxed );
             }
             else {
                 pOp->iInfo.pParent->m_pLeft.compare_exchange_strong( pLeaf, static_cast<tree_node *>( pOp->iInfo.pNew ),
-                    memory_model::memory_order_relaxed, atomics::memory_order_relaxed );
+                    memory_model::memory_order_release, atomics::memory_order_relaxed );
             }
 
             update_ptr cur( pOp, update_desc::IFlag );
             pOp->iInfo.pParent->m_pUpdate.compare_exchange_strong( cur, pOp->iInfo.pParent->null_update_desc(),
-                      memory_model::memory_order_release, atomics::memory_order_relaxed );
+                      memory_model::memory_order_acquire, atomics::memory_order_relaxed );
         }
 
         bool check_delete_precondition( search_result& res )
@@ -1423,7 +1423,7 @@ namespace cds { namespace intrusive {
             update_ptr pUpdate( pOp->dInfo.pUpdateParent );
             update_ptr pMark( pOp, update_desc::Mark );
             if ( pOp->dInfo.pParent->m_pUpdate.compare_exchange_strong( pUpdate, pMark,
-                    memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
+                    memory_model::memory_order_release, atomics::memory_order_relaxed ))
             {
                 help_marked( pOp );
                 retire_node( pOp->dInfo.pParent, rl );
@@ -1447,7 +1447,7 @@ namespace cds { namespace intrusive {
                 // Undo grandparent dInfo
                 update_ptr pDel( pOp, update_desc::DFlag );
                 if ( pOp->dInfo.pGrandParent->m_pUpdate.compare_exchange_strong( pDel, pOp->dInfo.pGrandParent->null_update_desc(),
-                    memory_model::memory_order_release, atomics::memory_order_relaxed ))
+                    memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
                 {
                     retire_update_desc( pOp, rl, false );
                 }
@@ -1473,7 +1473,7 @@ namespace cds { namespace intrusive {
 
             update_ptr upd( pOp, update_desc::DFlag );
             pOp->dInfo.pGrandParent->m_pUpdate.compare_exchange_strong( upd, pOp->dInfo.pGrandParent->null_update_desc(),
-                memory_model::memory_order_release, atomics::memory_order_relaxed );
+                memory_model::memory_order_acquire, atomics::memory_order_relaxed );
         }
 
         template <typename KeyValue, typename Compare>
@@ -1660,7 +1660,7 @@ namespace cds { namespace intrusive {
 
                             update_ptr updGP( res.updGrandParent.ptr());
                             if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
-                                memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
+                                memory_model::memory_order_release, atomics::memory_order_acquire ))
                             {
                                 if ( help_delete( pOp, updRetire )) {
                                     // res.pLeaf is not deleted yet since RCU is blocked
@@ -1738,7 +1738,7 @@ namespace cds { namespace intrusive {
 
                             update_ptr updGP( res.updGrandParent.ptr());
                             if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
-                                memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
+                                memory_model::memory_order_release, atomics::memory_order_acquire ))
                             {
                                 if ( help_delete( pOp, updRetire )) {
                                     pResult = node_traits::to_value_ptr( res.pLeaf );
@@ -1803,7 +1803,7 @@ namespace cds { namespace intrusive {
 
                             update_ptr updGP( res.updGrandParent.ptr());
                             if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
-                                memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
+                                memory_model::memory_order_release, atomics::memory_order_acquire ))
                             {
                                 if ( help_delete( pOp, updRetire )) {
                                     pResult = node_traits::to_value_ptr( res.pLeaf );
@@ -1867,7 +1867,7 @@ namespace cds { namespace intrusive {
 
                             update_ptr updGP( res.updGrandParent.ptr());
                             if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
-                                memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
+                                memory_model::memory_order_release, atomics::memory_order_acquire ))
                             {
                                 if ( help_delete( pOp, updRetire )) {
                                     pResult = node_traits::to_value_ptr( res.pLeaf );
@@ -1970,7 +1970,7 @@ namespace cds { namespace intrusive {
                         pNewInternal->infinite_key( 1 );
                     }
                     pNewInternal->m_pLeft.store( static_cast<tree_node *>(pNewLeaf), memory_model::memory_order_relaxed );
-                    pNewInternal->m_pRight.store( static_cast<tree_node *>(res.pLeaf), memory_model::memory_order_release );
+                    pNewInternal->m_pRight.store( static_cast<tree_node *>(res.pLeaf), memory_model::memory_order_relaxed );
                 }
                 else {
                     assert( !res.pLeaf->is_internal());
@@ -1978,7 +1978,7 @@ namespace cds { namespace intrusive {
 
                     key_extractor()( pNewInternal->m_Key, val );
                     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 );
+                    pNewInternal->m_pRight.store( static_cast<tree_node *>(pNewLeaf), memory_model::memory_order_relaxed );
                     assert( !res.pLeaf->infinite_key());
                 }
 
@@ -1991,7 +1991,7 @@ namespace cds { namespace intrusive {
 
                 update_ptr updCur( res.updParent.ptr());
                 if ( res.pParent->m_pUpdate.compare_exchange_strong( updCur, update_ptr( pOp, update_desc::IFlag ),
-                    memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
+                    memory_model::memory_order_release, atomics::memory_order_acquire ))
                 {
                     // do insert
                     help_insert( pOp );
index f935c13f5d9ce65dd122be34494bf050e59e4482..48154282f9b0732751c1fe8df8f12b46265946cd 100644 (file)
@@ -1149,17 +1149,17 @@ namespace cds { namespace intrusive {
             tree_node * pLeaf = static_cast<tree_node *>( pOp->iInfo.pLeaf );
             if ( pOp->iInfo.bRightLeaf ) {
                 CDS_VERIFY( pOp->iInfo.pParent->m_pRight.compare_exchange_strong( pLeaf, static_cast<tree_node *>( pOp->iInfo.pNew ),
-                    memory_model::memory_order_relaxed, atomics::memory_order_relaxed ));
+                    memory_model::memory_order_release, atomics::memory_order_relaxed ));
             }
             else {
                 CDS_VERIFY( pOp->iInfo.pParent->m_pLeft.compare_exchange_strong( pLeaf, static_cast<tree_node *>( pOp->iInfo.pNew ),
-                    memory_model::memory_order_relaxed, atomics::memory_order_relaxed ));
+                    memory_model::memory_order_release, atomics::memory_order_relaxed ));
             }
 
             // Unflag parent
             update_ptr cur( pOp, update_desc::IFlag );
             CDS_VERIFY( pOp->iInfo.pParent->m_pUpdate.compare_exchange_strong( cur, pOp->iInfo.pParent->null_update_desc(),
-                memory_model::memory_order_release, atomics::memory_order_relaxed ));
+                memory_model::memory_order_acquire, atomics::memory_order_relaxed ));
         }
 
         bool check_delete_precondition( search_result& res ) const
@@ -1179,7 +1179,7 @@ namespace cds { namespace intrusive {
             update_ptr pUpdate( pOp->dInfo.pUpdateParent );
             update_ptr pMark( pOp, update_desc::Mark );
             if ( pOp->dInfo.pParent->m_pUpdate.compare_exchange_strong( pUpdate, pMark, // *
-                memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
+                memory_model::memory_order_release, atomics::memory_order_relaxed ))
             {
                 help_marked( pOp );
 
@@ -1198,7 +1198,7 @@ namespace cds { namespace intrusive {
                 // Undo grandparent dInfo
                 update_ptr pDel( pOp, update_desc::DFlag );
                 if ( pOp->dInfo.pGrandParent->m_pUpdate.compare_exchange_strong( pDel, pOp->dInfo.pGrandParent->null_update_desc(),
-                    memory_model::memory_order_release, atomics::memory_order_relaxed ))
+                    memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
                 {
                     retire_update_desc( pOp );
                 }
@@ -1234,7 +1234,7 @@ namespace cds { namespace intrusive {
 
             update_ptr upd( pOp, update_desc::DFlag );
             CDS_VERIFY( pOp->dInfo.pGrandParent->m_pUpdate.compare_exchange_strong( upd, pOp->dInfo.pGrandParent->null_update_desc(),
-                memory_model::memory_order_release, atomics::memory_order_relaxed ));
+                memory_model::memory_order_acquire, atomics::memory_order_relaxed ));
         }
 
         bool try_insert( value_type& val, internal_node * pNewInternal, search_result& res )
@@ -1258,7 +1258,7 @@ namespace cds { namespace intrusive {
                         pNewInternal->infinite_key( 1 );
                     }
                     pNewInternal->m_pLeft.store( static_cast<tree_node *>(pNewLeaf), memory_model::memory_order_relaxed );
-                    pNewInternal->m_pRight.store( static_cast<tree_node *>(res.pLeaf), memory_model::memory_order_release );
+                    pNewInternal->m_pRight.store( static_cast<tree_node *>(res.pLeaf), memory_model::memory_order_relaxed );
                 }
                 else {
                     assert( !res.pLeaf->is_internal());
@@ -1266,7 +1266,7 @@ namespace cds { namespace intrusive {
                     pNewInternal->infinite_key( 0 );
                     key_extractor()(pNewInternal->m_Key, val);
                     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 );
+                    pNewInternal->m_pRight.store( static_cast<tree_node *>(pNewLeaf), memory_model::memory_order_relaxed );
                     assert( !res.pLeaf->infinite_key());
                 }
 
@@ -1281,7 +1281,7 @@ namespace cds { namespace intrusive {
 
                 update_ptr updCur( res.updParent.ptr());
                 if ( res.pParent->m_pUpdate.compare_exchange_strong( updCur, update_ptr( pOp, update_desc::IFlag ),
-                    memory_model::memory_order_acquire, atomics::memory_order_relaxed )) {
+                    memory_model::memory_order_release, atomics::memory_order_relaxed )) {
                     // do insert
                     help_insert( pOp );
                     retire_update_desc( pOp );
@@ -1327,7 +1327,7 @@ namespace cds { namespace intrusive {
 
                         update_ptr updGP( res.updGrandParent.ptr());
                         if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
-                            memory_model::memory_order_acquire, atomics::memory_order_relaxed )) {
+                            memory_model::memory_order_release, atomics::memory_order_relaxed )) {
                             if ( help_delete( pOp )) {
                                 // res.pLeaf is not deleted yet since it is guarded
                                 f( *node_traits::to_value_ptr( res.pLeaf ));
@@ -1378,7 +1378,7 @@ namespace cds { namespace intrusive {
 
                         update_ptr updGP( res.updGrandParent.ptr());
                         if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
-                            memory_model::memory_order_acquire, atomics::memory_order_relaxed )) {
+                            memory_model::memory_order_release, atomics::memory_order_relaxed )) {
                             if ( help_delete( pOp ))
                                 break;
                             pOp = nullptr;
@@ -1445,7 +1445,7 @@ namespace cds { namespace intrusive {
 
                         update_ptr updGP( res.updGrandParent.ptr());
                         if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
-                                memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
+                                memory_model::memory_order_release, atomics::memory_order_relaxed ))
                         {
                             if ( help_delete( pOp ))
                                 break;
@@ -1494,7 +1494,7 @@ namespace cds { namespace intrusive {
 
                         update_ptr updGP( res.updGrandParent.ptr());
                         if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
-                            memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
+                            memory_model::memory_order_release, atomics::memory_order_relaxed ))
                         {
                             if ( help_delete( pOp ))
                                 break;