diff options
Diffstat (limited to 'libc/private')
-rw-r--r-- | libc/private/bionic_atomic_gcc_builtin.h | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/libc/private/bionic_atomic_gcc_builtin.h b/libc/private/bionic_atomic_gcc_builtin.h index e7c5761..2919f7f 100644 --- a/libc/private/bionic_atomic_gcc_builtin.h +++ b/libc/private/bionic_atomic_gcc_builtin.h @@ -31,18 +31,17 @@ __ATOMIC_INLINE__ int __bionic_cmpxchg(int32_t old_value, int32_t new_value, volatile int32_t* ptr) { /* We must return 0 on success */ - return __sync_bool_compare_and_swap(ptr, old_value, new_value) == 0; + return __sync_val_compare_and_swap(ptr, old_value, new_value) != old_value; } __ATOMIC_INLINE__ int32_t __bionic_swap(int32_t new_value, volatile int32_t* ptr) { - int32_t prev; + int32_t old_value; do { - prev = *ptr; - status = __sync_val_compare_and_swap(ptr, prev, new_value); - } while (status == 0); - return prev; + old_value = *ptr; + } while (__sync_val_compare_and_swap(ptr, old_value, new_value) != old_value); + return old_value; } __ATOMIC_INLINE__ int32_t |