diff options
Diffstat (limited to 'libsanitizer/tsan/tsan_interface_atomic.cc')
-rw-r--r-- | libsanitizer/tsan/tsan_interface_atomic.cc | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/libsanitizer/tsan/tsan_interface_atomic.cc b/libsanitizer/tsan/tsan_interface_atomic.cc index 25f171ed07a..63860edcfbb 100644 --- a/libsanitizer/tsan/tsan_interface_atomic.cc +++ b/libsanitizer/tsan/tsan_interface_atomic.cc @@ -113,7 +113,10 @@ static morder ConvertOrder(morder mo) { } template<typename T> T func_xchg(volatile T *v, T op) { - return __sync_lock_test_and_set(v, op); + T res = __sync_lock_test_and_set(v, op); + // __sync_lock_test_and_set does not contain full barrier. + __sync_synchronize(); + return res; } template<typename T> T func_add(volatile T *v, T op) { @@ -253,6 +256,9 @@ static void AtomicStore(ThreadState *thr, uptr pc, volatile T *a, T v, thr->clock.ReleaseStore(&s->clock); *a = v; s->mtx.Unlock(); + // Trainling memory barrier to provide sequential consistency + // for Dekker-like store-load synchronization. + __sync_synchronize(); } template<typename T, T (*F)(volatile T *v, T op)> |