summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Boehm <hboehm@google.com>2014-07-29 14:11:54 -0700
committerHans Boehm <hboehm@google.com>2014-07-31 13:37:23 -0700
commit504c88d72c129f740d825305580f8444d358735d (patch)
treebcefbfebe1908e9f5a35af348fadf750bc0bfa10
parentf294081d501ad98b7d7f50bc73f291063caf2c5f (diff)
downloadchromium-504c88d72c129f740d825305580f8444d358735d.tar.gz
Remove android_atomic_cas64 use.
Prepare to remove 64 bit android_atomics. Change-Id: I242500963edbe94411d69ec3ad36d2ac5843c35c
-rw-r--r--base/atomicops_internals_arm64_gcc.h21
1 files changed, 12 insertions, 9 deletions
diff --git a/base/atomicops_internals_arm64_gcc.h b/base/atomicops_internals_arm64_gcc.h
index e832b29e..c3806a91 100644
--- a/base/atomicops_internals_arm64_gcc.h
+++ b/base/atomicops_internals_arm64_gcc.h
@@ -10,11 +10,16 @@
#define BASE_ATOMICOPS_INTERNALS_ARM64_GCC_H_
#pragma once
+#include <stdatomic.h>
+
namespace base {
namespace subtle {
#include <cutils/atomic-arm64.h>
+// TODO: Convert the rest of these to C++11 (or C11) atomics.
+// Or, even better, convert the clients.
+
inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
Atomic32 old_value,
Atomic32 new_value) {
@@ -29,18 +34,16 @@ inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
return prev_value;
}
+typedef volatile _Atomic(Atomic64)* atomic64_ptr_t;
+
inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
Atomic64 old_value,
Atomic64 new_value) {
- Atomic64 prev_value = *ptr;
- do {
- if (!android_atomic_cas64(old_value, new_value,
- const_cast<Atomic64*>(ptr))) {
- return old_value;
- }
- prev_value = *ptr;
- } while (prev_value == old_value);
- return prev_value;
+ Atomic64 old = old_value;
+ atomic_compare_exchange_strong_explicit(
+ reinterpret_cast<atomic64_ptr_t>(ptr),
+ &old, new_value, memory_order_relaxed, memory_order_relaxed);
+ return old; // possibly replaced by CAS
}
inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,