1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/ports/SkAtomics_android.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,61 @@ 1.4 +/* 1.5 + * Copyright 2013 Google Inc. 1.6 + * 1.7 + * Use of this source code is governed by a BSD-style license that can be 1.8 + * found in the LICENSE file. 1.9 + */ 1.10 + 1.11 +#ifndef SkAtomics_android_DEFINED 1.12 +#define SkAtomics_android_DEFINED 1.13 + 1.14 +/** Android framework atomics. */ 1.15 + 1.16 +#include <cutils/atomic.h> 1.17 +#include <stdint.h> 1.18 + 1.19 +static inline __attribute__((always_inline)) int32_t sk_atomic_inc(int32_t* addr) { 1.20 + return android_atomic_inc(addr); 1.21 +} 1.22 + 1.23 +static inline __attribute__((always_inline)) int32_t sk_atomic_add(int32_t* addr, int32_t inc) { 1.24 + return android_atomic_add(inc, addr); 1.25 +} 1.26 + 1.27 +static inline __attribute__((always_inline)) int32_t sk_atomic_dec(int32_t* addr) { 1.28 + return android_atomic_dec(addr); 1.29 +} 1.30 + 1.31 +static inline __attribute__((always_inline)) void sk_membar_acquire__after_atomic_dec() { 1.32 + //HACK: Android is actually using full memory barriers. 1.33 + // Should this change, uncomment below. 1.34 + //int dummy; 1.35 + //android_atomic_acquire_store(0, &dummy); 1.36 +} 1.37 + 1.38 +static inline __attribute__((always_inline)) int32_t sk_atomic_conditional_inc(int32_t* addr) { 1.39 + while (true) { 1.40 + int32_t value = *addr; 1.41 + if (value == 0) { 1.42 + return 0; 1.43 + } 1.44 + if (0 == android_atomic_release_cas(value, value + 1, addr)) { 1.45 + return value; 1.46 + } 1.47 + } 1.48 +} 1.49 + 1.50 +static inline __attribute__((always_inline)) bool sk_atomic_cas(int32_t* addr, 1.51 + int32_t before, 1.52 + int32_t after) { 1.53 + // android_atomic_release_cas returns 0 for success (if *addr == before and it wrote after). 1.54 + return android_atomic_release_cas(before, after, addr) == 0; 1.55 +} 1.56 + 1.57 +static inline __attribute__((always_inline)) void sk_membar_acquire__after_atomic_conditional_inc() { 1.58 + //HACK: Android is actually using full memory barriers. 1.59 + // Should this change, uncomment below. 1.60 + //int dummy; 1.61 + //android_atomic_acquire_store(0, &dummy); 1.62 +} 1.63 + 1.64 +#endif