diff options
| -rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_atomic_msvc.h | 8 | ||||
| -rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_mutex.h | 14 | 
2 files changed, 15 insertions, 7 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_atomic_msvc.h b/compiler-rt/lib/sanitizer_common/sanitizer_atomic_msvc.h index dc22ef05e58..65bf20338b5 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_atomic_msvc.h +++ b/compiler-rt/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/compiler-rt/lib/sanitizer_common/sanitizer_mutex.h b/compiler-rt/lib/sanitizer_common/sanitizer_mutex.h index 196c3f53e68..c7589f76ed3 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_mutex.h +++ b/compiler-rt/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;      }  | 

