Restored acq-rel fence in urcu access_lock().
authorkhizmax <khizmax@gmail.com>
Mon, 24 Apr 2017 16:05:21 +0000 (19:05 +0300)
committerkhizmax <khizmax@gmail.com>
Mon, 24 Apr 2017 16:05:21 +0000 (19:05 +0300)
Seems, CLang 3.6/3.7 cannot handle acquire barrier on atomic var correctly

cds/urcu/details/gp.h
cds/urcu/details/sh.h

index 41287a7d4029381b0ccec7b55e9f3c7bba5567b4..eb43fc5f4a23258d1cf62c0525b0760b58e8df8e 100644 (file)
@@ -70,8 +70,13 @@ namespace cds { namespace urcu { namespace details {
             pRec->m_nAccessControl.store( gp_singleton<RCUtag>::instance()->global_control_word(atomics::memory_order_relaxed),
                 atomics::memory_order_relaxed );
 
+#   if CDS_COMPILER == CDS_COMPILER_CLANG && CDS_COMPILER_VERSION < 30800
+            // Seems, CLang 3.6-3.7 cannot handle acquire barrier correctly
+            CDS_COMPILER_RW_BARRIER;
+#   else
             // acquire barrier
             pRec->m_nAccessControl.load( atomics::memory_order_acquire );
+#   endif
         }
         else {
             // nested lock
index 8d0969f2fc93f2ffdf9dc0585d88a56123276392..f02c37a4cfe9b4e0619402489872a0ef4c620411 100644 (file)
@@ -74,8 +74,13 @@ namespace cds { namespace urcu { namespace details {
             pRec->m_nAccessControl.store( sh_singleton<RCUtag>::instance()->global_control_word(atomics::memory_order_relaxed),
                 atomics::memory_order_relaxed );
 
+#   if CDS_COMPILER == CDS_COMPILER_CLANG && CDS_COMPILER_VERSION < 30800
+            // Seems, CLang 3.6-3.7 cannot handle acquire barrier correctly
+            CDS_COMPILER_RW_BARRIER;
+#   else
             // acquire barrier
             pRec->m_nAccessControl.load( atomics::memory_order_acquire );
+#   endif
         }
         else {
             // nested lock