From 6201688e08044e0e4fd1910e77116319de89636c Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Tue, 4 Mar 2014 11:57:25 +0000 Subject: [PATCH] tsan: fix windows build git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@202831 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/sanitizer_common/sanitizer_atomic_msvc.h | 8 ++++++++ lib/sanitizer_common/sanitizer_mutex.h | 14 +++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/lib/sanitizer_common/sanitizer_atomic_msvc.h b/lib/sanitizer_common/sanitizer_atomic_msvc.h index dc22ef05e..65bf20338 100644 --- a/lib/sanitizer_common/sanitizer_atomic_msvc.h +++ b/lib/sanitizer_common/sanitizer_atomic_msvc.h @@ -108,6 +108,14 @@ INLINE u32 atomic_fetch_add(volatile atomic_uint32_t *a, (volatile long*)&a->val_dont_use, (long)v); // NOLINT } +INLINE u32 atomic_fetch_sub(volatile atomic_uint32_t *a, + u32 v, memory_order mo) { + (void)mo; + DCHECK(!((uptr)a % sizeof(*a))); + return (u32)_InterlockedExchangeAdd( + (volatile long*)&a->val_dont_use, -(long)v); // NOLINT +} + INLINE u8 atomic_exchange(volatile atomic_uint8_t *a, u8 v, memory_order mo) { (void)mo; diff --git a/lib/sanitizer_common/sanitizer_mutex.h b/lib/sanitizer_common/sanitizer_mutex.h index 196c3f53e..c7589f76e 100644 --- a/lib/sanitizer_common/sanitizer_mutex.h +++ b/lib/sanitizer_common/sanitizer_mutex.h @@ -95,7 +95,7 @@ class RWMutex { } void Lock() { - uptr cmp = kUnlocked; + u32 cmp = kUnlocked; if (atomic_compare_exchange_strong(&state_, &cmp, kWriteLock, memory_order_acquire)) return; @@ -103,20 +103,20 @@ class RWMutex { } void Unlock() { - uptr prev = atomic_fetch_sub(&state_, kWriteLock, memory_order_release); + u32 prev = atomic_fetch_sub(&state_, kWriteLock, memory_order_release); DCHECK_NE(prev & kWriteLock, 0); (void)prev; } void ReadLock() { - uptr prev = atomic_fetch_add(&state_, kReadLock, memory_order_acquire); + u32 prev = atomic_fetch_add(&state_, kReadLock, memory_order_acquire); if ((prev & kWriteLock) == 0) return; ReadLockSlow(); } void ReadUnlock() { - uptr prev = atomic_fetch_sub(&state_, kReadLock, memory_order_release); + u32 prev = atomic_fetch_sub(&state_, kReadLock, memory_order_release); DCHECK_EQ(prev & kWriteLock, 0); DCHECK_GT(prev & ~kWriteLock, 0); (void)prev; @@ -127,7 +127,7 @@ class RWMutex { } private: - atomic_uintptr_t state_; + atomic_uint32_t state_; enum { kUnlocked = 0, @@ -141,7 +141,7 @@ class RWMutex { proc_yield(10); else internal_sched_yield(); - uptr cmp = atomic_load(&state_, memory_order_relaxed); + u32 cmp = atomic_load(&state_, memory_order_relaxed); if (cmp == kUnlocked && atomic_compare_exchange_weak(&state_, &cmp, kWriteLock, memory_order_acquire)) @@ -155,7 +155,7 @@ class RWMutex { proc_yield(10); else internal_sched_yield(); - uptr prev = atomic_load(&state_, memory_order_acquire); + u32 prev = atomic_load(&state_, memory_order_acquire); if ((prev & kWriteLock) == 0) return; } -- 2.11.4.GIT