diff options
author | bbudge@chromium.org <bbudge@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-22 21:55:24 +0000 |
---|---|---|
committer | bbudge@chromium.org <bbudge@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-22 21:55:24 +0000 |
commit | 21f21433d3c2d7ce40a860093922905da90bd351 (patch) | |
tree | 612d62faea3716deabad1085318ba7c569a8cace /base/atomicops_internals_gcc.h | |
parent | ba976b845cd6f65a08d86100be8e15700ced2a34 (diff) | |
download | chromium_src-21f21433d3c2d7ce40a860093922905da90bd351.zip chromium_src-21f21433d3c2d7ce40a860093922905da90bd351.tar.gz chromium_src-21f21433d3c2d7ce40a860093922905da90bd351.tar.bz2 |
Fix atomicops internal implementation using GCC intrinsics.
BUG=116317
TEST=none
Review URL: https://chromiumcodereview.appspot.com/10879019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@152833 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/atomicops_internals_gcc.h')
-rw-r--r-- | base/atomicops_internals_gcc.h | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/base/atomicops_internals_gcc.h b/base/atomicops_internals_gcc.h index fe7a862..ed1b2d7 100644 --- a/base/atomicops_internals_gcc.h +++ b/base/atomicops_internals_gcc.h @@ -17,9 +17,11 @@ inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, Atomic32 new_value) { Atomic32 prev_value; do { - prev_value = __sync_val_compare_and_swap(ptr, old_value, new_value); - } while (prev_value != old_value); - return old_value; + if (__sync_bool_compare_and_swap(ptr, old_value, new_value)) + return old_value; + prev_value = *ptr; + } while (prev_value == old_value); + return prev_value; } inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, |