Index: include/core/SkThread.h |
diff --git a/include/core/SkThread.h b/include/core/SkThread.h |
index 7e2c90ed519295d2f3d0a526c684a6034d3e5669..c8cd4e9112aad6492ece41d40c06ac8d628a8b37 100644 |
--- a/include/core/SkThread.h |
+++ b/include/core/SkThread.h |
@@ -27,12 +27,6 @@ static int32_t sk_atomic_add(int32_t* addr, int32_t inc); |
*/ |
static int32_t sk_atomic_dec(int32_t* addr); |
-/** Atomically adds one to the int referenced by addr iff the referenced int was not 0 |
- * and returns the previous value. |
- * No additional memory barrier is required; this must act as a compiler barrier. |
- */ |
-static int32_t sk_atomic_conditional_inc(int32_t* addr); |
- |
/** Atomic compare and set. |
* If *addr == before, set *addr to after and return true, otherwise return false. |
* This must act as a release (SL/S) memory barrier and as a compiler barrier. |
@@ -51,6 +45,21 @@ static void sk_membar_acquire__after_atomic_conditional_inc(); |
#include SK_ATOMICS_PLATFORM_H |
+/** Atomically adds one to the int referenced by addr iff the referenced int was not 0 |
+ * and returns the previous value. |
+ * No additional memory barrier is required; this must act as a compiler barrier. |
+ */ |
+static inline int32_t sk_atomic_conditional_inc(int32_t* addr) { |
+ int32_t prev; |
+ do { |
+ prev = *addr; |
+ if (0 == prev) { |
+ break; |
+ } |
+ } while (!sk_atomic_cas(addr, prev, prev+1)); |
+ return prev; |
+} |
+ |
/** SK_MUTEX_PLATFORM_H must provide the following (or equivalent) declarations. |
class SkBaseMutex { |