IterableList: fixed memory ordering bugs found by TSan
authorkhizmax <khizmax@gmail.com>
Mon, 17 Oct 2016 11:49:44 +0000 (14:49 +0300)
committerkhizmax <khizmax@gmail.com>
Mon, 17 Oct 2016 11:49:44 +0000 (14:49 +0300)
cds/intrusive/details/iterable_list_base.h
cds/intrusive/impl/iterable_list.h

index 07e6efd..2662571 100644 (file)
@@ -57,14 +57,16 @@ namespace cds { namespace intrusive {
 
             //@cond
             node()
-                : next( nullptr )
-                , data( nullptr )
-            {}
+            {
+                next.store( nullptr, atomics::memory_order_release );
+                data.store( marked_data_ptr(), atomics::memory_order_release );
+            }
 
             node( value_type * pVal )
-                : next( nullptr )
-                , data( pVal )
-            {}
+            {
+                next.store( nullptr, atomics::memory_order_release );
+                data.store( marked_data_ptr( pVal ), atomics::memory_order_release );
+            }
             //@endcond
         };
 
index 54fb2c9..fc5fb14 100644 (file)
@@ -1096,7 +1096,7 @@ namespace cds { namespace intrusive {
             while ( true ) {
                 node_type * pCur = pPrev->next.load( memory_model::memory_order_relaxed );
 
-                if ( pCur == pCur->next.load( memory_model::memory_order_relaxed )) {
+                if ( pCur == pCur->next.load( memory_model::memory_order_acquire )) {
                     // end-of-list
                     pos.pPrev = pPrev;
                     pos.pCur = pCur;
@@ -1134,7 +1134,7 @@ namespace cds { namespace intrusive {
             while ( true ) {
                 node_type * pCur = pPrev->next.load( memory_model::memory_order_relaxed );
 
-                if ( pCur == pCur->next.load( memory_model::memory_order_relaxed ) ) {
+                if ( pCur == pCur->next.load( memory_model::memory_order_acquire )) {
                     // end-of-list
                     pos.pPrev = pPrev;
                     pos.pCur = pCur;