OSDN Git Service

Add an atomic add operation.
authorOwen Anderson <resistor@mac.com>
Tue, 23 Jun 2009 17:39:31 +0000 (17:39 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 23 Jun 2009 17:39:31 +0000 (17:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73964 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/System/Atomic.h
lib/System/Atomic.cpp

index adbb975..c4049d4 100644 (file)
@@ -26,6 +26,7 @@ namespace llvm {
                             cas_flag old_value);
     cas_flag AtomicIncrement(volatile cas_flag* ptr);
     cas_flag AtomicDecrement(volatile cas_flag* ptr);
+    cas_flag AtomicAdd(volatile cas_flag* ptr, cas_flag val);
   }
 }
 
index 416f981..6e751a3 100644 (file)
@@ -78,4 +78,17 @@ sys::cas_flag sys::AtomicDecrement(volatile sys::cas_flag* ptr) {
 #endif
 }
 
+sys::cas_flag sys::AtomicAdd(volatile sys::cas_flag* ptr, sys::cas_flag val) {
+#if LLVM_MULTITHREADED==0
+  *ptr += val;
+  return *ptr;
+#elif defined(__GNUC__)
+  return __sync_add_and_fetch(ptr, val);
+#elif defined(_MSC_VER)
+  return InterlockedAdd(ptr, val);
+#else
+#  error No atomic add implementation for your platform!
+#endif
+}
+