aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Support/Atomic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Support/Atomic.cpp')
-rw-r--r--lib/Support/Atomic.cpp16
1 files changed, 6 insertions, 10 deletions
diff --git a/lib/Support/Atomic.cpp b/lib/Support/Atomic.cpp
index 015b9c5..58497b9 100644
--- a/lib/Support/Atomic.cpp
+++ b/lib/Support/Atomic.cpp
@@ -14,7 +14,7 @@
#include "llvm/Support/Atomic.h"
#include "llvm/Config/llvm-config.h"
#if defined(ANDROID_TARGET_BUILD)
-# include "sys/atomics.h"
+#include "cutils/atomic.h"
#endif
using namespace llvm;
@@ -47,7 +47,8 @@ sys::cas_flag sys::CompareAndSwap(volatile sys::cas_flag* ptr,
*ptr = new_value;
return result;
#elif defined(ANDROID_TARGET_BUILD)
- return __atomic_cmpxchg(old_value, new_value, (volatile int*)ptr);
+ return android_atomic_cmpxchg((int32_t)old_value, (int32_t)new_value,
+ (volatile int*)ptr);
#elif defined(__GNUC__)
return __sync_val_compare_and_swap(ptr, old_value, new_value);
#elif defined(_MSC_VER)
@@ -62,7 +63,7 @@ sys::cas_flag sys::AtomicIncrement(volatile sys::cas_flag* ptr) {
++(*ptr);
return *ptr;
#elif defined(ANDROID_TARGET_BUILD)
- return __atomic_inc((volatile int*)ptr);
+ return android_atomic_inc((volatile int*)ptr);
#elif defined(__GNUC__)
return __sync_add_and_fetch(ptr, 1);
#elif defined(_MSC_VER)
@@ -77,7 +78,7 @@ sys::cas_flag sys::AtomicDecrement(volatile sys::cas_flag* ptr) {
--(*ptr);
return *ptr;
#elif defined(ANDROID_TARGET_BUILD)
- return __atomic_dec((volatile int*)ptr);
+ return android_atomic_dec((volatile int*)ptr);
#elif defined(__GNUC__)
return __sync_sub_and_fetch(ptr, 1);
#elif defined(_MSC_VER)
@@ -92,12 +93,7 @@ sys::cas_flag sys::AtomicAdd(volatile sys::cas_flag* ptr, sys::cas_flag val) {
*ptr += val;
return *ptr;
#elif defined(ANDROID_TARGET_BUILD)
- sys::cas_flag original, result;
- do {
- original = *ptr;
- result = original + val;
- } while (__atomic_cmpxchg(original, result, (volatile int*)ptr) != original);
- return result;
+ return android_atomic_add((int32_t)val, (volatile int*)ptr);
#elif defined(__GNUC__)
return __sync_add_and_fetch(ptr, val);
#elif defined(_MSC_VER)