diff options
author | bungeman@google.com <bungeman@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-05-16 18:21:56 +0000 |
---|---|---|
committer | bungeman@google.com <bungeman@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-05-16 18:21:56 +0000 |
commit | a02bc1519cf49afa31fb38bed097dd5014880d04 (patch) | |
tree | 64d0638ce6c287317467d07bb5f7aeeb290d7940 /src/ports/SkThread_pthread.cpp | |
parent | b2aacb6dc29f853e3f37fad208ad8fe8c8138a03 (diff) |
WeakRefCnt
http://codereview.appspot.com/5649046/
git-svn-id: http://skia.googlecode.com/svn/trunk@3978 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/ports/SkThread_pthread.cpp')
-rw-r--r-- | src/ports/SkThread_pthread.cpp | 32 |
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 |