[TSan] Fixed memory order constraints
authorkhizmax <libcds.dev@gmail.com>
Mon, 10 Apr 2017 20:28:49 +0000 (23:28 +0300)
committerkhizmax <libcds.dev@gmail.com>
Mon, 10 Apr 2017 20:28:49 +0000 (23:28 +0300)
cds/algo/flat_combining/defs.h
cds/algo/flat_combining/kernel.h

index 35e04ed7411713142d5d8c277bc7493833db118c..14608cad01f1ff5202f777c29b2f38ac3a20f235 100644 (file)
@@ -66,11 +66,12 @@ namespace cds { namespace algo { namespace flat_combining {
         /// Initializes publication record
         publication_record()
             : nRequest( req_EmptyRecord )
-            , nState( inactive )
             , nAge( 0 )
             , pNext( nullptr )
             , pNextAllocated( nullptr )
-        {}
+        {
+            nState.store( inactive, atomics::memory_order_release );
+        }
 
         /// Returns the value of \p nRequest field
         unsigned int op( atomics::memory_order mo = atomics::memory_order_relaxed ) const
index c4c2ce23aea9f9533d1d167761d536e4d7cd6010..30dcc7dcc20b2818e5764b3535ba8c15d7f2b57a 100644 (file)
@@ -324,9 +324,9 @@ namespace cds { namespace algo {
 
                     // Insert in allocated list
                     assert( m_pAllocatedHead != nullptr );
-                    publication_record* p = m_pAllocatedHead->pNextAllocated.load( memory_model::memory_order_acquire );
+                    publication_record* p = m_pAllocatedHead->pNextAllocated.load( memory_model::memory_order_relaxed );
                     do {
-                        pRec->pNextAllocated.store( p, memory_model::memory_order_relaxed );
+                        pRec->pNextAllocated.store( p, memory_model::memory_order_release );
                     } while ( !m_pAllocatedHead->pNextAllocated.compare_exchange_weak( p, pRec, memory_model::memory_order_release, atomics::memory_order_acquire ));
 
                     publish( pRec );
@@ -602,10 +602,10 @@ namespace cds { namespace algo {
 
                 // Insert record to publication list
                 if ( m_pHead != static_cast<publication_record *>(pRec)) {
-                    publication_record * p = m_pHead->pNext.load(memory_model::memory_order_relaxed);
+                    publication_record * p = m_pHead->pNext.load( memory_model::memory_order_relaxed );
                     if ( p != static_cast<publication_record *>( pRec )) {
                         do {
-                            pRec->pNext.store( p, memory_model::memory_order_relaxed );
+                            pRec->pNext.store( p, memory_model::memory_order_release );
                             // Failed CAS changes p
                         } while ( !m_pHead->pNext.compare_exchange_weak( p, static_cast<publication_record *>(pRec),
                             memory_model::memory_order_release, atomics::memory_order_acquire ));