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 07e6efdefde2fc5b1d0bfabaf5c54c2cbc134d6e..266257170d7ca6ecb5d30db223c0968478394e48 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 54fb2c9ce1c034b701a75b8fa13887e680ce9675..fc5fb14a4e84f8390cee565d897ff735e4f1fb4a 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;