[compiler-rt] r202831 - tsan: fix windows build

Dmitry Vyukov dvyukov at google.com
Tue Mar 4 03:57:25 PST 2014


Author: dvyukov
Date: Tue Mar  4 05:57:25 2014
New Revision: 202831

URL: http://llvm.org/viewvc/llvm-project?rev=202831&view=rev
Log:
tsan: fix windows build


Modified:
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_mutex.h

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h?rev=202831&r1=202830&r2=202831&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h Tue Mar  4 05:57:25 2014
@@ -108,6 +108,14 @@ INLINE u32 atomic_fetch_add(volatile ato
       (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;

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_mutex.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_mutex.h?rev=202831&r1=202830&r2=202831&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_mutex.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_mutex.h Tue Mar  4 05:57:25 2014
@@ -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;
     }





More information about the llvm-commits mailing list