[llvm-commits] [llvm] r71795 - /llvm/trunk/include/llvm/System/Atomic.h

Owen Anderson resistor at mac.com
Thu May 14 14:24:18 PDT 2009


Author: resistor
Date: Thu May 14 16:24:15 2009
New Revision: 71795

URL: http://llvm.org/viewvc/llvm-project?rev=71795&view=rev
Log:
Add CompareAndSwap.

Modified:
    llvm/trunk/include/llvm/System/Atomic.h

Modified: llvm/trunk/include/llvm/System/Atomic.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Atomic.h?rev=71795&r1=71794&r2=71795&view=diff

==============================================================================
--- llvm/trunk/include/llvm/System/Atomic.h (original)
+++ llvm/trunk/include/llvm/System/Atomic.h Thu May 14 16:24:15 2009
@@ -11,34 +11,70 @@
 //
 //===----------------------------------------------------------------------===//
 
+#ifndef LLVM_SYSTEM_ATOMIC_H
+#define LLVM_SYSTEM_ATOMIC_H
+
 #include "llvm/Config/config.h"
+#include <stdint.h>
 
 #ifdef __APPLE__
-#include <libkern/OSAtomic.h>
+
 #elif LLVM_ON_WIN32
 #include <windows.h>
 #endif
 
 
-#ifndef LLVM_SYSTEM_ATOMIC_H
-#define LLVM_SYSTEM_ATOMIC_H
-
 namespace llvm {
   namespace sys {
-    inline void MemoryFence() {
+    
 #if !defined(ENABLE_THREADS) || ENABLE_THREADS == 0
+    inline void MemoryFence() {
       return;
+    }
+    
+    typedef uint32_t cas_flag;
+    inline cas_flag CompareAndSwap(cas_flag* dest, cas_flag exc, cas_flag c) {
+      cas_flag result = *dest;
+      if (result == c)
+        *dest = exc;
+      return result;
+    }
+    
 #elif __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
+    inline void MemoryFence() {
       __sync_synchronize();
+    }
+    
+    typedef volatile uint32_t cas_flag;
+    inline cas_flag CompareAndSwap(cas_flag* dest, cas_flag exc, cas_flag c) {
+      return __sync_val_compare_and_swap(dest, exc, c);
+    }
+    
 #elif defined(__APPLE__)
+    inline void MemoryFence() {
       OSMemoryBarrier();
+    }
+    
+    typedef volatile UInt32 cas_flag;
+    inline cas_flag CompareAndSwap(cas_flag* dest, cas_flag exc, cas_flag c) {
+      cas_flag old = *dest;
+      OSCompareAndSwap(c, exc, dest);
+      return old;
+    }
 #elif defined(LLVM_ON_WIN32)
 #warning Memory fence implementation requires Windows 2003 or later.
+    inline void MemoryFence() {
       MemoryBarrier();
+    }
+    
+    typedef volatile long cas_flag;
+    inline cas_flag CompareAndSwap(cas_flag* dest, cas_flag exc, cas_flag c) {
+      return _InterlockedCompareExchange(dest, exc, c);
+    }
 #else
-#warning No memory fence implementation found for you platform!
+#error No memory atomics implementation for your platform!
 #endif
-    }
+    
   }
 }
 





More information about the llvm-commits mailing list