Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1623)

Unified Diff: native_client_sdk/src/libraries/sdk_util/atomicops.h

Issue 18644009: [NaCl SDK] Upate atomic ops in nacl_io (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add declartions for newval and oldval Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698