diff options
author | Owen Anderson <resistor@mac.com> | 2009-05-20 18:26:15 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2009-05-20 18:26:15 +0000 |
commit | e5370f409bc5f308f26e79ee5dd1595f83667c2e (patch) | |
tree | 91de1326377fc05a422274e862404ec95ddd0eb9 /llvm/lib/System/Atomic.cpp | |
parent | f1c25029b4c60d5930330aceb08a9219277d0267 (diff) | |
download | bcm5719-llvm-e5370f409bc5f308f26e79ee5dd1595f83667c2e.tar.gz bcm5719-llvm-e5370f409bc5f308f26e79ee5dd1595f83667c2e.zip |
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.
llvm-svn: 72174
Diffstat (limited to 'llvm/lib/System/Atomic.cpp')
-rw-r--r-- | llvm/lib/System/Atomic.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/llvm/lib/System/Atomic.cpp b/llvm/lib/System/Atomic.cpp new file mode 100644 index 00000000000..fa8a937c07f --- /dev/null +++ b/llvm/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 |