summaryrefslogtreecommitdiffstats
path: root/base/atomicops_internals_gcc.h
diff options
context:
space:
mode:
authorbbudge@chromium.org <bbudge@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-22 21:55:24 +0000
committerbbudge@chromium.org <bbudge@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-22 21:55:24 +0000
commit21f21433d3c2d7ce40a860093922905da90bd351 (patch)
tree612d62faea3716deabad1085318ba7c569a8cace /base/atomicops_internals_gcc.h
parentba976b845cd6f65a08d86100be8e15700ced2a34 (diff)
downloadchromium_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.h8
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,