aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ports/SkThread_pthread.cpp
diff options
context:
space:
mode:
authorGravatar bungeman@google.com <bungeman@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-05-16 18:21:56 +0000
committerGravatar bungeman@google.com <bungeman@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-05-16 18:21:56 +0000
commita02bc1519cf49afa31fb38bed097dd5014880d04 (patch)
tree64d0638ce6c287317467d07bb5f7aeeb290d7940 /src/ports/SkThread_pthread.cpp
parentb2aacb6dc29f853e3f37fad208ad8fe8c8138a03 (diff)
WeakRefCnt
Diffstat (limited to 'src/ports/SkThread_pthread.cpp')
-rw-r--r--src/ports/SkThread_pthread.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/ports/SkThread_pthread.cpp b/src/ports/SkThread_pthread.cpp
index 6a4fade1aa..d0bb3acbad 100644
--- a/src/ports/SkThread_pthread.cpp
+++ b/src/ports/SkThread_pthread.cpp
@@ -39,6 +39,27 @@ int32_t sk_atomic_dec(int32_t* addr)
{
return __sync_fetch_and_add(addr, -1);
}
+void sk_membar_aquire__after_atomic_dec() { }
+
+int32_t sk_atomic_conditional_inc(int32_t* addr)
+{
+ int32_t value = *addr;
+
+ while (true) {
+ if (value == 0) {
+ return 0;
+ }
+
+ int32_t before = __sync_val_compare_and_swap(addr, value, value + 1);
+
+ if (before == value) {
+ return value;
+ } else {
+ value = before;
+ }
+ }
+}
+void sk_membar_aquire__after_atomic_conditional_inc() { }
#else
@@ -61,6 +82,17 @@ int32_t sk_atomic_dec(int32_t* addr)
*addr = value - 1;
return value;
}
+void sk_membar_aquire__after_atomic_dec() { }
+
+int32_t sk_atomic_conditional_inc(int32_t* addr)
+{
+ SkAutoMutexAcquire ac(gAtomicMutex);
+
+ int32_t value = *addr;
+ if (value != 0) ++*addr;
+ return value;
+}
+void sk_membar_aquire__after_atomic_conditional_inc() { }
#endif