| Index: native_client_sdk/src/libraries/sdk_util/atomicops.h
|
| diff --git a/native_client_sdk/src/libraries/sdk_util/atomicops.h b/native_client_sdk/src/libraries/sdk_util/atomicops.h
|
| index 80d62d215712b05bfa5b9c141d25c4baf46674ce..cd07b4411868fb9c15694db614be7777f16c9151 100644
|
| --- a/native_client_sdk/src/libraries/sdk_util/atomicops.h
|
| +++ b/native_client_sdk/src/libraries/sdk_util/atomicops.h
|
| @@ -17,10 +17,28 @@ static inline void MemoryBarrier() {
|
| }
|
| #endif
|
|
|
| +inline Atomic32 AtomicCompareExchange(volatile Atomic32* ptr,
|
| + Atomic32 new_value,
|
| + Atomic32 old_value) {
|
| + return __sync_val_compare_and_swap(ptr, new_value, old_value);
|
| +}
|
| +
|
| inline Atomic32 AtomicAddFetch(volatile Atomic32* ptr, Atomic32 value) {
|
| return __sync_add_and_fetch(ptr, value);
|
| }
|
|
|
| +inline Atomic32 AtomicAndFetch(volatile Atomic32* ptr, Atomic32 value) {
|
| + return __sync_and_and_fetch(ptr, value);
|
| +}
|
| +
|
| +inline Atomic32 AtomicOrFetch(volatile Atomic32* ptr, Atomic32 value) {
|
| + return __sync_or_and_fetch(ptr, value);
|
| +}
|
| +
|
| +inline Atomic32 AtomicXorFetch(volatile Atomic32* ptr, Atomic32 value) {
|
| + return __sync_xor_and_fetch(ptr, value);
|
| +}
|
| +
|
| #else
|
|
|
| #include <windows.h>
|
| @@ -35,9 +53,49 @@ typedef long Atomic32;
|
|
|
| /* Windows.h already defines a MemoryBarrier macro. */
|
|
|
| +inline Atomic32 AtomicCompareExchange(volatile Atomic32* ptr,
|
| + Atomic32 newvalue,
|
| + Atomic32 oldvalue) {
|
| + return InterlockedCompareExchange(ptr, newvalue, oldvalue);
|
| +}
|
| +
|
| inline Atomic32 AtomicAddFetch(volatile Atomic32* ptr, Atomic32 value) {
|
| return InterlockedExchangeAdd(ptr, value);
|
| }
|
| +
|
| +inline Atomic32 AtomicAndFetch(volatile Atomic32* ptr, Atomic32 value) {
|
| + Atomic32 oldval;
|
| + Atomic32 newval;
|
| + do {
|
| + oldval = *ptr;
|
| + newval = oldval & value;
|
| + } while (InterlockedCompareExchange(ptr, newval, oldval) != oldval);
|
| +
|
| + return newval;
|
| +}
|
| +
|
| +inline Atomic32 AtomicOrFetch(volatile Atomic32* ptr, Atomic32 value) {
|
| + Atomic32 oldval;
|
| + Atomic32 newval;
|
| + do {
|
| + oldval = *ptr;
|
| + newval = oldval | value;
|
| + } while (InterlockedCompareExchange(ptr,newval, oldval) != oldval);
|
| +
|
| + return newval;
|
| +}
|
| +
|
| +inline Atomic32 AtomicXorFetch(volatile Atomic32* ptr, Atomic32 value) {
|
| + Atomic32 oldval;
|
| + Atomic32 newval;
|
| + do {
|
| + oldval = *ptr;
|
| + newval = oldval ^ value;
|
| + } while (InterlockedCompareExchange(ptr,newval, oldval) != oldval);
|
| +
|
| + return newval;
|
| +}
|
| +
|
| #endif
|
|
|
|
|
|
|