blob: 2827d8896594544b09ec4176bfd4f3846087aff4 [file] [log] [blame]
Owen Anderson3c1eaa02009-05-20 18:26:15 +00001//===-- Atomic.cpp - Atomic Operations --------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This header file implements atomic operations.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/System/Atomic.h"
15#include "llvm/Config/config.h"
16
17using namespace llvm;
18
19#if defined(_MSC_VER)
20#include <windows.h>
Owen Andersond8cf4032009-06-02 17:35:55 +000021#undef MemoryFence
Owen Anderson3c1eaa02009-05-20 18:26:15 +000022#endif
23
24void sys::MemoryFence() {
25#if LLVM_MULTITHREADED==0
26 return;
27#else
28# if defined(__GNUC__)
29 __sync_synchronize();
30# elif defined(_MSC_VER)
31 MemoryBarrier();
32# else
33# error No memory fence implementation for your platform!
34# endif
35#endif
36}
37
38sys::cas_flag sys::CompareAndSwap(volatile sys::cas_flag* ptr,
Owen Anderson2aa783b2009-05-20 19:06:49 +000039 sys::cas_flag new_value,
40 sys::cas_flag old_value) {
Owen Anderson3c1eaa02009-05-20 18:26:15 +000041#if LLVM_MULTITHREADED==0
Owen Anderson41583b92009-05-20 19:01:50 +000042 sys::cas_flag result = *ptr;
43 if (result == old_value)
44 *ptr = new_value;
Owen Anderson3c1eaa02009-05-20 18:26:15 +000045 return result;
46#elif defined(__GNUC__)
47 return __sync_val_compare_and_swap(ptr, old_value, new_value);
48#elif defined(_MSC_VER)
Owen Anderson2aa783b2009-05-20 19:06:49 +000049 return InterlockedCompareExchange(ptr, new_value, old_value);
Owen Anderson3c1eaa02009-05-20 18:26:15 +000050#else
51# error No compare-and-swap implementation for your platform!
52#endif
Duncan Sands05a8c872009-06-03 11:54:28 +000053}