diff options
author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-05-27 15:00:32 +0000 |
---|---|---|
committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-05-27 15:00:32 +0000 |
commit | 81da061f7285bbcf0acc31142042a9cd0ab8f068 (patch) | |
tree | c19014d3f7de5c434f0f14b688e465ad3753145d /include | |
parent | 29239a0f4b309663c17475bb6bc0a849093abeb6 (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.h | 21 |
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 { |