[llvm-commits] [llvm] r72174 - in /llvm/trunk: include/llvm/System/Atomic.h lib/System/Atomic.cpp

Owen Anderson resistor at mac.com
Wed May 20 11:26:15 PDT 2009


Author: resistor
Date: Wed May 20 13:26:15 2009
New Revision: 72174

URL: http://llvm.org/viewvc/llvm-project?rev=72174&view=rev
Log:
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.

Added:
    llvm/trunk/lib/System/Atomic.cpp
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=72174&r1=72173&r2=72174&view=diff

==============================================================================
--- llvm/trunk/include/llvm/System/Atomic.h (original)
+++ llvm/trunk/include/llvm/System/Atomic.h Wed May 20 13:26:15 2009
@@ -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);
   }
 }
 

Added: llvm/trunk/lib/System/Atomic.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Atomic.cpp?rev=72174&view=auto

==============================================================================
--- llvm/trunk/lib/System/Atomic.cpp (added)
+++ llvm/trunk/lib/System/Atomic.cpp Wed May 20 13:26:15 2009
@@ -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





More information about the llvm-commits mailing list