[llvm-commits] [llvm] r72174 - in /llvm/trunk: include/llvm/System/Atomic.h lib/System/Atomic.cpp
Howard Su
howard0su at gmail.com
Wed May 20 17:03:37 PDT 2009
don't inlcude platform dependent header here. please include
"llvm/Support/DataTypes.h" instead.
Also, please update CMakeLists file also to add Atomic.cpp.
On Thu, May 21, 2009 at 2:26 AM, Owen Anderson <resistor at mac.com> wrote:
> 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
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
--
-Howard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20090521/fb14577b/attachment.html>
More information about the llvm-commits
mailing list