diff options
author | Hans Boehm <hboehm@google.com> | 2014-07-29 14:11:54 -0700 |
---|---|---|
committer | Hans Boehm <hboehm@google.com> | 2014-07-31 13:37:23 -0700 |
commit | 504c88d72c129f740d825305580f8444d358735d (patch) | |
tree | bcefbfebe1908e9f5a35af348fadf750bc0bfa10 | |
parent | f294081d501ad98b7d7f50bc73f291063caf2c5f (diff) | |
download | chromium-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.h | 21 |
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, |