Fix up the Windows portion of Atomic.h. This is untested, but it is my best understa...
authorOwen Anderson <resistor@mac.com>
Tue, 19 May 2009 01:07:40 +0000 (01:07 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 19 May 2009 01:07:40 +0000 (01:07 +0000)
I'd be much obliged if someone on MSVC++ could try this out and let me know if it works.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@72087 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/System/Atomic.h

index 5162f5d3c63fadd991fc3d952ed06577c1daec0b..5bdbaffe023493d2c196a081c4c803a3e9830bf1 100644 (file)
@@ -62,11 +62,24 @@ namespace llvm {
     }
 #elif defined(_MSC_VER)
     typedef LONG cas_flag;
+    template<typename T>
     inline T CompareAndSwap(volatile T* ptr,
                            T new_value,
                            T old_value) {
-      return InterlockedCompareExchange(addr, new_value, old_value);
+      if (sizeof(T) == 4)
+       return InterlockedCompareExchange(ptr, new_value, old_value);
+      else
+       return InterlockedCompareExchange64(ptr, new_value, old_value);
+    }
+    
+    template<typename T>
+    inline T* CompareAndSwap<T*>(volatile T** ptr,
+                                T* new_value,
+                                T* old_value) {
+      return InterlockedCompareExchangePtr(ptr, new_value, old_value);
     }
+
+
 #else
 #  error No compare-and-swap implementation for your platform!
 #endif