aboutsummaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-05-27 15:00:32 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-05-27 15:00:32 +0000
commit81da061f7285bbcf0acc31142042a9cd0ab8f068 (patch)
treec19014d3f7de5c434f0f14b688e465ad3753145d /include
parent29239a0f4b309663c17475bb6bc0a849093abeb6 (diff)
Implement sk_atomic_conditional_inc with sk_atomic_cas.
Now that we have sk_atomic_cas, we can replace all the platform-specific CAS loops with one. BUG=skia: R=bungeman@google.com, mtklein@google.com, reed@google.com Author: mtklein@chromium.org Review URL: https://codereview.chromium.org/300553003 git-svn-id: http://skia.googlecode.com/svn/trunk@14892 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'include')
-rw-r--r--include/core/SkThread.h21
1 files changed, 15 insertions, 6 deletions
diff --git a/include/core/SkThread.h b/include/core/SkThread.h
index 7e2c90ed51..c8cd4e9112 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 {