aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2009-05-20 18:26:15 +0000
committerOwen Anderson <resistor@mac.com>2009-05-20 18:26:15 +0000
commit3c1eaa0dc2b359997e97514d97a6fdd28e4abd0b (patch)
tree30467ececb7db3dbcf349296889cf8f9aa3015b1
parent261f2a2337990bc7cc3d9e20d3338de54b26c74c (diff)
Move atomic operations' definitions out of line. While this seems kind of silly,
all kinds of problems caused by including windows.h and/or config.h in an LLVM header. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@72174 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/System/Atomic.h71
-rw-r--r--lib/System/Atomic.cpp52
2 files changed, 58 insertions, 65 deletions
diff --git a/include/llvm/System/Atomic.h b/include/llvm/System/Atomic.h
index fafd69797b..eeb4fe26da 100644
--- a/include/llvm/System/Atomic.h
+++ b/include/llvm/System/Atomic.h
@@ -14,75 +14,16 @@
#ifndef LLVM_SYSTEM_ATOMIC_H
#define LLVM_SYSTEM_ATOMIC_H
-#include "llvm/Config/config.h"
-
-#if defined(_MSC_VER)
-#define NOMINMAX
-#include <windows.h>
-#endif
-
+#include <stdint.h>
namespace llvm {
namespace sys {
-
- inline void MemoryFence() {
-#if LLVM_MULTITHREADED==0
- return;
-#else
-# if defined(__GNUC__)
- __sync_synchronize();
-# elif defined(_MSC_VER)
- MemoryBarrier();
-# else
-# error No memory fence implementation for your platform!
-# endif
-#endif
-}
-
-#if LLVM_MULTITHREADED==0
- typedef unsigned long cas_flag;
- template<typename T>
- inline T CompareAndSwap(volatile T* dest,
- T exc, T c) {
- T result = *dest;
- if (result == c)
- *dest = exc;
- return result;
- }
-#elif defined(__GNUC__)
- typedef unsigned long cas_flag;
- template<typename T>
- inline T CompareAndSwap(volatile T* ptr,
- T new_value,
- T old_value) {
- return __sync_val_compare_and_swap(ptr, old_value, new_value);
- }
-#elif defined(_MSC_VER)
- typedef LONG cas_flag;
- template<typename T>
- inline T CompareAndSwap(volatile T* ptr,
- T new_value,
- T old_value) {
- if (sizeof(T) == 4)
- return InterlockedCompareExchange(ptr, new_value, old_value);
- else if (sizeof(T) == 8)
- return InterlockedCompareExchange64(ptr, new_value, old_value);
- else
- assert(0 && "Unsupported compare-and-swap size!");
- }
-
- 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
+ void MemoryFence();
+ typedef uint32_t cas_flag;
+ cas_flag CompareAndSwap(volatile cas_flag* ptr,
+ cas_flag new_value,
+ cas_flag old_value);
}
}
diff --git a/lib/System/Atomic.cpp b/lib/System/Atomic.cpp
new file mode 100644
index 0000000000..fa8a937c07
--- /dev/null
+++ b/lib/System/Atomic.cpp
@@ -0,0 +1,52 @@
+//===-- Atomic.cpp - Atomic Operations --------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This header file implements atomic operations.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/System/Atomic.h"
+#include "llvm/Config/config.h"
+
+using namespace llvm;
+
+#if defined(_MSC_VER)
+#include <windows.h>
+#endif
+
+void sys::MemoryFence() {
+#if LLVM_MULTITHREADED==0
+ return;
+#else
+# if defined(__GNUC__)
+ __sync_synchronize();
+# elif defined(_MSC_VER)
+ MemoryBarrier();
+# else
+# error No memory fence implementation for your platform!
+# endif
+#endif
+}
+
+sys::cas_flag sys::CompareAndSwap(volatile sys::cas_flag* ptr,
+ sys::cas_flag new_value,
+ sys::cas_flag old_value) {
+#if LLVM_MULTITHREADED==0
+ T result = *dest;
+ if (result == c)
+ *dest = exc;
+ return result;
+#elif defined(__GNUC__)
+ return __sync_val_compare_and_swap(ptr, old_value, new_value);
+#elif defined(_MSC_VER)
+ return InterlockedCompareExchange(ptr, new_value, old_value);
+#else
+# error No compare-and-swap implementation for your platform!
+#endif
+} \ No newline at end of file