diff src/os_cpu/bsd_zero/vm/atomic_bsd_zero.inline.hpp @ 22854:4ebc1b290dbd

8067331: Zero: Atomic::xchg and Atomic::xchg_ptr need full memory barrier Reviewed-by: dholmes, coleenp
author sgehwolf
date Tue, 24 Feb 2015 21:17:59 -0500
parents 63e54c37ac64
children
line wrap: on
line diff
--- a/src/os_cpu/bsd_zero/vm/atomic_bsd_zero.inline.hpp	Mon Dec 15 09:36:46 2014 +0100
+++ b/src/os_cpu/bsd_zero/vm/atomic_bsd_zero.inline.hpp	Tue Feb 24 21:17:59 2015 -0500
@@ -238,7 +238,13 @@
   // operation.  Note that some platforms only support this with the
   // limitation that the only valid value to store is the immediate
   // constant 1.  There is a test for this in JNI_CreateJavaVM().
-  return __sync_lock_test_and_set (dest, exchange_value);
+  jint result = __sync_lock_test_and_set (dest, exchange_value);
+  // All atomic operations are expected to be full memory barriers
+  // (see atomic.hpp). However, __sync_lock_test_and_set is not
+  // a full memory barrier, but an acquire barrier. Hence, this added
+  // barrier.
+  __sync_synchronize();
+  return result;
 #endif // M68K
 #endif // ARM
 }
@@ -251,7 +257,9 @@
 #ifdef M68K
   return m68k_lock_test_and_set(dest, exchange_value);
 #else
-  return __sync_lock_test_and_set (dest, exchange_value);
+  intptr_t result = __sync_lock_test_and_set (dest, exchange_value);
+  __sync_synchronize();
+  return result;
 #endif // M68K
 #endif // ARM
 }