aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ports/SkAtomics_android.h
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-01-08 21:15:56 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-01-08 21:15:56 +0000
commit4b5fba5a3cc29058088a9a62df1da83e1a3c7db0 (patch)
treef50e71f9e8f93b6649b36aecd13068e8e1ae6a83 /src/ports/SkAtomics_android.h
parentd4ba6e778122df9b52dc68a2f41210d33fd43471 (diff)
Use a spinlock in SkOnce.
SkOnceFlag is now statically initializable on all platforms. Also adds sk_atomic_cas, used to implement new SkSpinlock. Going to punt on making SkOnceFlag any smaller (for now, it's 8 bytes). We could conceivably get it down to two bits, one for done and one for a one-bit spinlock (we'd need atomic-& and atomic-| to make that work, but they appear to be available everywhere). BUG=skia:1929 R=bungeman@google.com, reed@google.com Author: mtklein@google.com Review URL: https://codereview.chromium.org/123093002 git-svn-id: http://skia.googlecode.com/svn/trunk@12968 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/ports/SkAtomics_android.h')
-rw-r--r--src/ports/SkAtomics_android.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/ports/SkAtomics_android.h b/src/ports/SkAtomics_android.h
index 5cc8ba5430..e7b2133175 100644
--- a/src/ports/SkAtomics_android.h
+++ b/src/ports/SkAtomics_android.h
@@ -36,6 +36,13 @@ static inline __attribute__((always_inline)) int32_t sk_atomic_conditional_inc(i
}
}
+static inline __attribute___((always_inline)) bool sk_atomic_cas(int32_t* addr,
+ int32_t before,
+ int32_t after) {
+ // android_atomic_release_cas returns 0 for success (if *addr == before and it wrote after).
+ return android_atomic_release_cas(before, after, addr) == 0;
+}
+
static inline __attribute__((always_inline)) void sk_membar_acquire__after_atomic_conditional_inc() {
//HACK: Android is actually using full memory barriers.
// Should this change, uncomment below.