TSan: fixed MichaelList memory ordering constraints
authorkhizmax <libcds.dev@gmail.com>
Wed, 3 Jun 2015 21:30:59 +0000 (00:30 +0300)
committerkhizmax <libcds.dev@gmail.com>
Wed, 3 Jun 2015 21:30:59 +0000 (00:30 +0300)
cds/intrusive/impl/michael_list.h
cds/intrusive/michael_list_rcu.h

index 97023f6d0b2fddc9ff734265790ab6bef3f4e00d..a2b7141457c422d95271627e039598f6c2ff9485 100644 (file)
@@ -1065,13 +1065,13 @@ namespace cds { namespace intrusive {
 
             back_off        bkoff;
 
 
             back_off        bkoff;
 
-try_again:
+        try_again:
             pPrev = &refHead;
             pNext = nullptr;
 
             pCur = pPrev->load(memory_model::memory_order_acquire);
             pos.guards.assign( position::guard_current_item, node_traits::to_value_ptr( pCur.ptr() ) );
             pPrev = &refHead;
             pNext = nullptr;
 
             pCur = pPrev->load(memory_model::memory_order_acquire);
             pos.guards.assign( position::guard_current_item, node_traits::to_value_ptr( pCur.ptr() ) );
-            if ( pPrev->load(memory_model::memory_order_relaxed) != pCur.ptr() )
+            if ( pPrev->load(memory_model::memory_order_acquire) != pCur.ptr() )
                 goto try_again;
 
             while ( true ) {
                 goto try_again;
 
             while ( true ) {
@@ -1084,12 +1084,9 @@ try_again:
 
                 pNext = pCur->m_pNext.load(memory_model::memory_order_acquire);
                 pos.guards.assign( position::guard_next_item, node_traits::to_value_ptr( pNext.ptr() ));
 
                 pNext = pCur->m_pNext.load(memory_model::memory_order_acquire);
                 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() ) {
-                    bkoff();
-                    goto try_again;
-                }
-
-                if ( pPrev->load(memory_model::memory_order_relaxed).all() != pCur.ptr() ) {
+                if ( pCur->m_pNext.load(memory_model::memory_order_acquire).all() != pNext.all() 
+                  || pPrev->load(memory_model::memory_order_acquire).all() != pCur.ptr() )
+                {
                     bkoff();
                     goto try_again;
                 }
                     bkoff();
                     goto try_again;
                 }
index f8b59f518d7027af49ae90c9208eadd046ddac71..59ee10acf7a2aeb05af1449c28964da16ed9795e 100644 (file)
@@ -131,7 +131,7 @@ namespace cds { namespace intrusive {
 
         static void clear_links( node_type * pNode )
         {
 
         static void clear_links( node_type * pNode )
         {
-            pNode->m_pNext.store( marked_node_ptr(), memory_model::memory_order_relaxed );
+            pNode->m_pNext.store( marked_node_ptr(), memory_model::memory_order_release );
             pNode->m_pDelChain = nullptr;
         }
 
             pNode->m_pDelChain = nullptr;
         }