Loading include/cutils/atomic-arm.h +47 −35 Original line number Original line Diff line number Diff line Loading @@ -20,72 +20,78 @@ #include <stdint.h> #include <stdint.h> #include <machine/cpu-features.h> #include <machine/cpu-features.h> extern inline void android_compiler_barrier(void) #ifndef ANDROID_ATOMIC_INLINE #define ANDROID_ATOMIC_INLINE inline __attribute__((always_inline)) #endif extern ANDROID_ATOMIC_INLINE void android_compiler_barrier(void) { { __asm__ __volatile__ ("" : : : "memory"); __asm__ __volatile__ ("" : : : "memory"); } } #if ANDROID_SMP == 0 #if ANDROID_SMP == 0 extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { android_compiler_barrier(); android_compiler_barrier(); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { android_compiler_barrier(); android_compiler_barrier(); } } #elif defined(__ARM_HAVE_DMB) #elif defined(__ARM_HAVE_DMB) extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { __asm__ __volatile__ ("dmb" : : : "memory"); __asm__ __volatile__ ("dmb" : : : "memory"); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { __asm__ __volatile__ ("dmb st" : : : "memory"); __asm__ __volatile__ ("dmb st" : : : "memory"); } } #elif defined(__ARM_HAVE_LDREX_STREX) #elif defined(__ARM_HAVE_LDREX_STREX) extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory"); __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory"); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { android_memory_barrier(); android_memory_barrier(); } } #else #else extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { typedef void (kuser_memory_barrier)(void); typedef void (kuser_memory_barrier)(void); (*(kuser_memory_barrier *)0xffff0fa0)(); (*(kuser_memory_barrier *)0xffff0fa0)(); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { android_memory_barrier(); android_memory_barrier(); } } #endif #endif extern inline int32_t android_atomic_acquire_load(volatile const int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_acquire_load(volatile const int32_t *ptr) { { int32_t value = *ptr; int32_t value = *ptr; android_memory_barrier(); android_memory_barrier(); return value; return value; } } extern inline int32_t android_atomic_release_load(volatile const int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_release_load(volatile const int32_t *ptr) { { android_memory_barrier(); android_memory_barrier(); return *ptr; return *ptr; } } extern inline void android_atomic_acquire_store(int32_t value, extern ANDROID_ATOMIC_INLINE void volatile int32_t *ptr) android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) { { *ptr = value; *ptr = value; android_memory_barrier(); android_memory_barrier(); } } extern inline void android_atomic_release_store(int32_t value, extern ANDROID_ATOMIC_INLINE void volatile int32_t *ptr) android_atomic_release_store(int32_t value, volatile int32_t *ptr) { { android_memory_barrier(); android_memory_barrier(); *ptr = value; *ptr = value; Loading @@ -95,8 +101,8 @@ extern inline void android_atomic_release_store(int32_t value, extern int android_atomic_cas(int32_t old_value, int32_t new_value, extern int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr); volatile int32_t *ptr); #elif defined(__ARM_HAVE_LDREX_STREX) #elif defined(__ARM_HAVE_LDREX_STREX) extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, extern ANDROID_ATOMIC_INLINE int volatile int32_t *ptr) android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; do { do { Loading @@ -111,8 +117,8 @@ extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, return prev != old_value; return prev != old_value; } } #else #else extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, extern ANDROID_ATOMIC_INLINE int volatile int32_t *ptr) android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) { { typedef int (kuser_cmpxchg)(int32_t, int32_t, volatile int32_t *); typedef int (kuser_cmpxchg)(int32_t, int32_t, volatile int32_t *); int32_t prev, status; int32_t prev, status; Loading @@ -127,7 +133,8 @@ extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, } } #endif #endif extern inline int android_atomic_acquire_cas(int32_t old_value, extern ANDROID_ATOMIC_INLINE int android_atomic_acquire_cas(int32_t old_value, int32_t new_value, int32_t new_value, volatile int32_t *ptr) volatile int32_t *ptr) { { Loading @@ -136,7 +143,8 @@ extern inline int android_atomic_acquire_cas(int32_t old_value, return status; return status; } } extern inline int android_atomic_release_cas(int32_t old_value, extern ANDROID_ATOMIC_INLINE int android_atomic_release_cas(int32_t old_value, int32_t new_value, int32_t new_value, volatile int32_t *ptr) volatile int32_t *ptr) { { Loading @@ -149,8 +157,8 @@ extern inline int android_atomic_release_cas(int32_t old_value, extern int32_t android_atomic_add(int32_t increment, extern int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr); volatile int32_t *ptr); #elif defined(__ARM_HAVE_LDREX_STREX) #elif defined(__ARM_HAVE_LDREX_STREX) extern inline int32_t android_atomic_add(int32_t increment, extern ANDROID_ATOMIC_INLINE int32_t volatile int32_t *ptr) android_atomic_add(int32_t increment, volatile int32_t *ptr) { { int32_t prev, tmp, status; int32_t prev, tmp, status; android_memory_barrier(); android_memory_barrier(); Loading @@ -166,8 +174,8 @@ extern inline int32_t android_atomic_add(int32_t increment, return prev; return prev; } } #else #else extern inline int32_t android_atomic_add(int32_t increment, extern ANDROID_ATOMIC_INLINE int32_t volatile int32_t *ptr) android_atomic_add(int32_t increment, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; android_memory_barrier(); android_memory_barrier(); Loading @@ -179,12 +187,12 @@ extern inline int32_t android_atomic_add(int32_t increment, } } #endif #endif extern inline int32_t android_atomic_inc(volatile int32_t *addr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_inc(volatile int32_t *addr) { { return android_atomic_add(1, addr); return android_atomic_add(1, addr); } } extern inline int32_t android_atomic_dec(volatile int32_t *addr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_dec(volatile int32_t *addr) { { return android_atomic_add(-1, addr); return android_atomic_add(-1, addr); } } Loading @@ -192,7 +200,8 @@ extern inline int32_t android_atomic_dec(volatile int32_t *addr) #if defined(__thumb__) #if defined(__thumb__) extern int32_t android_atomic_and(int32_t value, volatile int32_t *ptr); extern int32_t android_atomic_and(int32_t value, volatile int32_t *ptr); #elif defined(__ARM_HAVE_LDREX_STREX) #elif defined(__ARM_HAVE_LDREX_STREX) extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) { { int32_t prev, tmp, status; int32_t prev, tmp, status; android_memory_barrier(); android_memory_barrier(); Loading @@ -208,7 +217,8 @@ extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) return prev; return prev; } } #else #else extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; android_memory_barrier(); android_memory_barrier(); Loading @@ -223,7 +233,8 @@ extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) #if defined(__thumb__) #if defined(__thumb__) extern int32_t android_atomic_or(int32_t value, volatile int32_t *ptr); extern int32_t android_atomic_or(int32_t value, volatile int32_t *ptr); #elif defined(__ARM_HAVE_LDREX_STREX) #elif defined(__ARM_HAVE_LDREX_STREX) extern inline int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) { { int32_t prev, tmp, status; int32_t prev, tmp, status; android_memory_barrier(); android_memory_barrier(); Loading @@ -239,7 +250,8 @@ extern inline int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) return prev; return prev; } } #else #else extern inline int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; android_memory_barrier(); android_memory_barrier(); Loading include/cutils/atomic-mips.h +39 −27 Original line number Original line Diff line number Diff line Loading @@ -19,60 +19,66 @@ #include <stdint.h> #include <stdint.h> extern inline void android_compiler_barrier(void) #ifndef ANDROID_ATOMIC_INLINE #define ANDROID_ATOMIC_INLINE inline __attribute__((always_inline)) #endif extern ANDROID_ATOMIC_INLINE void android_compiler_barrier(void) { { __asm__ __volatile__ ("" : : : "memory"); __asm__ __volatile__ ("" : : : "memory"); } } #if ANDROID_SMP == 0 #if ANDROID_SMP == 0 extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { android_compiler_barrier(); android_compiler_barrier(); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { android_compiler_barrier(); android_compiler_barrier(); } } #else #else extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { __asm__ __volatile__ ("sync" : : : "memory"); __asm__ __volatile__ ("sync" : : : "memory"); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { __asm__ __volatile__ ("sync" : : : "memory"); __asm__ __volatile__ ("sync" : : : "memory"); } } #endif #endif extern inline int32_t android_atomic_acquire_load(volatile const int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_acquire_load(volatile const int32_t *ptr) { { int32_t value = *ptr; int32_t value = *ptr; android_memory_barrier(); android_memory_barrier(); return value; return value; } } extern inline int32_t android_atomic_release_load(volatile const int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_release_load(volatile const int32_t *ptr) { { android_memory_barrier(); android_memory_barrier(); return *ptr; return *ptr; } } extern inline void android_atomic_acquire_store(int32_t value, extern ANDROID_ATOMIC_INLINE void volatile int32_t *ptr) android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) { { *ptr = value; *ptr = value; android_memory_barrier(); android_memory_barrier(); } } extern inline void android_atomic_release_store(int32_t value, extern ANDROID_ATOMIC_INLINE void volatile int32_t *ptr) android_atomic_release_store(int32_t value, volatile int32_t *ptr) { { android_memory_barrier(); android_memory_barrier(); *ptr = value; *ptr = value; } } extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, extern ANDROID_ATOMIC_INLINE int volatile int32_t *ptr) android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; do { do { Loading @@ -90,7 +96,8 @@ extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, return prev != old_value; return prev != old_value; } } extern inline int android_atomic_acquire_cas(int32_t old_value, extern ANDROID_ATOMIC_INLINE int android_atomic_acquire_cas(int32_t old_value, int32_t new_value, int32_t new_value, volatile int32_t *ptr) volatile int32_t *ptr) { { Loading @@ -99,7 +106,8 @@ extern inline int android_atomic_acquire_cas(int32_t old_value, return status; return status; } } extern inline int android_atomic_release_cas(int32_t old_value, extern ANDROID_ATOMIC_INLINE int android_atomic_release_cas(int32_t old_value, int32_t new_value, int32_t new_value, volatile int32_t *ptr) volatile int32_t *ptr) { { Loading @@ -108,8 +116,8 @@ extern inline int android_atomic_release_cas(int32_t old_value, } } extern inline int32_t android_atomic_swap(int32_t new_value, extern ANDROID_ATOMIC_INLINE int32_t volatile int32_t *ptr) android_atomic_swap(int32_t new_value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; do { do { Loading @@ -125,8 +133,8 @@ extern inline int32_t android_atomic_swap(int32_t new_value, return prev; return prev; } } extern inline int32_t android_atomic_add(int32_t increment, extern ANDROID_ATOMIC_INLINE int32_t volatile int32_t *ptr) android_atomic_add(int32_t increment, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; android_memory_barrier(); android_memory_barrier(); Loading @@ -142,17 +150,20 @@ extern inline int32_t android_atomic_add(int32_t increment, return prev; return prev; } } extern inline int32_t android_atomic_inc(volatile int32_t *addr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_inc(volatile int32_t *addr) { { return android_atomic_add(1, addr); return android_atomic_add(1, addr); } } extern inline int32_t android_atomic_dec(volatile int32_t *addr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_dec(volatile int32_t *addr) { { return android_atomic_add(-1, addr); return android_atomic_add(-1, addr); } } extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; android_memory_barrier(); android_memory_barrier(); Loading @@ -168,7 +179,8 @@ extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) return prev; return prev; } } extern inline int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; android_memory_barrier(); android_memory_barrier(); Loading include/cutils/atomic-x86.h +37 −26 Original line number Original line Diff line number Diff line Loading @@ -19,60 +19,66 @@ #include <stdint.h> #include <stdint.h> extern inline void android_compiler_barrier(void) #ifndef ANDROID_ATOMIC_INLINE #define ANDROID_ATOMIC_INLINE inline __attribute__((always_inline)) #endif extern ANDROID_ATOMIC_INLINE void android_compiler_barrier(void) { { __asm__ __volatile__ ("" : : : "memory"); __asm__ __volatile__ ("" : : : "memory"); } } #if ANDROID_SMP == 0 #if ANDROID_SMP == 0 extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { android_compiler_barrier(); android_compiler_barrier(); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { android_compiler_barrier(); android_compiler_barrier(); } } #else #else extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { __asm__ __volatile__ ("mfence" : : : "memory"); __asm__ __volatile__ ("mfence" : : : "memory"); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { android_compiler_barrier(); android_compiler_barrier(); } } #endif #endif extern inline int32_t android_atomic_acquire_load(volatile const int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_acquire_load(volatile const int32_t *ptr) { { int32_t value = *ptr; int32_t value = *ptr; android_compiler_barrier(); android_compiler_barrier(); return value; return value; } } extern inline int32_t android_atomic_release_load(volatile const int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_release_load(volatile const int32_t *ptr) { { android_memory_barrier(); android_memory_barrier(); return *ptr; return *ptr; } } extern inline void android_atomic_acquire_store(int32_t value, extern ANDROID_ATOMIC_INLINE void volatile int32_t *ptr) android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) { { *ptr = value; *ptr = value; android_memory_barrier(); android_memory_barrier(); } } extern inline void android_atomic_release_store(int32_t value, extern ANDROID_ATOMIC_INLINE void volatile int32_t *ptr) android_atomic_release_store(int32_t value, volatile int32_t *ptr) { { android_compiler_barrier(); android_compiler_barrier(); *ptr = value; *ptr = value; } } extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, extern ANDROID_ATOMIC_INLINE int volatile int32_t *ptr) android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) { { int32_t prev; int32_t prev; __asm__ __volatile__ ("lock; cmpxchgl %1, %2" __asm__ __volatile__ ("lock; cmpxchgl %1, %2" Loading @@ -82,7 +88,8 @@ extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, return prev != old_value; return prev != old_value; } } extern inline int android_atomic_acquire_cas(int32_t old_value, extern ANDROID_ATOMIC_INLINE int android_atomic_acquire_cas(int32_t old_value, int32_t new_value, int32_t new_value, volatile int32_t *ptr) volatile int32_t *ptr) { { Loading @@ -90,7 +97,8 @@ extern inline int android_atomic_acquire_cas(int32_t old_value, return android_atomic_cas(old_value, new_value, ptr); return android_atomic_cas(old_value, new_value, ptr); } } extern inline int android_atomic_release_cas(int32_t old_value, extern ANDROID_ATOMIC_INLINE int android_atomic_release_cas(int32_t old_value, int32_t new_value, int32_t new_value, volatile int32_t *ptr) volatile int32_t *ptr) { { Loading @@ -98,8 +106,8 @@ extern inline int android_atomic_release_cas(int32_t old_value, return android_atomic_cas(old_value, new_value, ptr); return android_atomic_cas(old_value, new_value, ptr); } } extern inline int32_t android_atomic_add(int32_t increment, extern ANDROID_ATOMIC_INLINE int32_t volatile int32_t *ptr) android_atomic_add(int32_t increment, volatile int32_t *ptr) { { __asm__ __volatile__ ("lock; xaddl %0, %1" __asm__ __volatile__ ("lock; xaddl %0, %1" : "+r" (increment), "+m" (*ptr) : "+r" (increment), "+m" (*ptr) Loading @@ -108,18 +116,20 @@ extern inline int32_t android_atomic_add(int32_t increment, return increment; return increment; } } extern inline int32_t android_atomic_inc(volatile int32_t *addr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_inc(volatile int32_t *addr) { { return android_atomic_add(1, addr); return android_atomic_add(1, addr); } } extern inline int32_t android_atomic_dec(volatile int32_t *addr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_dec(volatile int32_t *addr) { { return android_atomic_add(-1, addr); return android_atomic_add(-1, addr); } } extern inline int32_t android_atomic_and(int32_t value, extern ANDROID_ATOMIC_INLINE int32_t volatile int32_t *ptr) android_atomic_and(int32_t value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; do { do { Loading @@ -129,7 +139,8 @@ extern inline int32_t android_atomic_and(int32_t value, return prev; return prev; } } extern inline int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; do { do { Loading libcutils/atomic.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -14,6 +14,6 @@ * limitations under the License. * limitations under the License. */ */ #define inline #define ANDROID_ATOMIC_INLINE #include <cutils/atomic-inline.h> #include <cutils/atomic-inline.h> Loading
include/cutils/atomic-arm.h +47 −35 Original line number Original line Diff line number Diff line Loading @@ -20,72 +20,78 @@ #include <stdint.h> #include <stdint.h> #include <machine/cpu-features.h> #include <machine/cpu-features.h> extern inline void android_compiler_barrier(void) #ifndef ANDROID_ATOMIC_INLINE #define ANDROID_ATOMIC_INLINE inline __attribute__((always_inline)) #endif extern ANDROID_ATOMIC_INLINE void android_compiler_barrier(void) { { __asm__ __volatile__ ("" : : : "memory"); __asm__ __volatile__ ("" : : : "memory"); } } #if ANDROID_SMP == 0 #if ANDROID_SMP == 0 extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { android_compiler_barrier(); android_compiler_barrier(); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { android_compiler_barrier(); android_compiler_barrier(); } } #elif defined(__ARM_HAVE_DMB) #elif defined(__ARM_HAVE_DMB) extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { __asm__ __volatile__ ("dmb" : : : "memory"); __asm__ __volatile__ ("dmb" : : : "memory"); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { __asm__ __volatile__ ("dmb st" : : : "memory"); __asm__ __volatile__ ("dmb st" : : : "memory"); } } #elif defined(__ARM_HAVE_LDREX_STREX) #elif defined(__ARM_HAVE_LDREX_STREX) extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory"); __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory"); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { android_memory_barrier(); android_memory_barrier(); } } #else #else extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { typedef void (kuser_memory_barrier)(void); typedef void (kuser_memory_barrier)(void); (*(kuser_memory_barrier *)0xffff0fa0)(); (*(kuser_memory_barrier *)0xffff0fa0)(); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { android_memory_barrier(); android_memory_barrier(); } } #endif #endif extern inline int32_t android_atomic_acquire_load(volatile const int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_acquire_load(volatile const int32_t *ptr) { { int32_t value = *ptr; int32_t value = *ptr; android_memory_barrier(); android_memory_barrier(); return value; return value; } } extern inline int32_t android_atomic_release_load(volatile const int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_release_load(volatile const int32_t *ptr) { { android_memory_barrier(); android_memory_barrier(); return *ptr; return *ptr; } } extern inline void android_atomic_acquire_store(int32_t value, extern ANDROID_ATOMIC_INLINE void volatile int32_t *ptr) android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) { { *ptr = value; *ptr = value; android_memory_barrier(); android_memory_barrier(); } } extern inline void android_atomic_release_store(int32_t value, extern ANDROID_ATOMIC_INLINE void volatile int32_t *ptr) android_atomic_release_store(int32_t value, volatile int32_t *ptr) { { android_memory_barrier(); android_memory_barrier(); *ptr = value; *ptr = value; Loading @@ -95,8 +101,8 @@ extern inline void android_atomic_release_store(int32_t value, extern int android_atomic_cas(int32_t old_value, int32_t new_value, extern int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr); volatile int32_t *ptr); #elif defined(__ARM_HAVE_LDREX_STREX) #elif defined(__ARM_HAVE_LDREX_STREX) extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, extern ANDROID_ATOMIC_INLINE int volatile int32_t *ptr) android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; do { do { Loading @@ -111,8 +117,8 @@ extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, return prev != old_value; return prev != old_value; } } #else #else extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, extern ANDROID_ATOMIC_INLINE int volatile int32_t *ptr) android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) { { typedef int (kuser_cmpxchg)(int32_t, int32_t, volatile int32_t *); typedef int (kuser_cmpxchg)(int32_t, int32_t, volatile int32_t *); int32_t prev, status; int32_t prev, status; Loading @@ -127,7 +133,8 @@ extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, } } #endif #endif extern inline int android_atomic_acquire_cas(int32_t old_value, extern ANDROID_ATOMIC_INLINE int android_atomic_acquire_cas(int32_t old_value, int32_t new_value, int32_t new_value, volatile int32_t *ptr) volatile int32_t *ptr) { { Loading @@ -136,7 +143,8 @@ extern inline int android_atomic_acquire_cas(int32_t old_value, return status; return status; } } extern inline int android_atomic_release_cas(int32_t old_value, extern ANDROID_ATOMIC_INLINE int android_atomic_release_cas(int32_t old_value, int32_t new_value, int32_t new_value, volatile int32_t *ptr) volatile int32_t *ptr) { { Loading @@ -149,8 +157,8 @@ extern inline int android_atomic_release_cas(int32_t old_value, extern int32_t android_atomic_add(int32_t increment, extern int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr); volatile int32_t *ptr); #elif defined(__ARM_HAVE_LDREX_STREX) #elif defined(__ARM_HAVE_LDREX_STREX) extern inline int32_t android_atomic_add(int32_t increment, extern ANDROID_ATOMIC_INLINE int32_t volatile int32_t *ptr) android_atomic_add(int32_t increment, volatile int32_t *ptr) { { int32_t prev, tmp, status; int32_t prev, tmp, status; android_memory_barrier(); android_memory_barrier(); Loading @@ -166,8 +174,8 @@ extern inline int32_t android_atomic_add(int32_t increment, return prev; return prev; } } #else #else extern inline int32_t android_atomic_add(int32_t increment, extern ANDROID_ATOMIC_INLINE int32_t volatile int32_t *ptr) android_atomic_add(int32_t increment, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; android_memory_barrier(); android_memory_barrier(); Loading @@ -179,12 +187,12 @@ extern inline int32_t android_atomic_add(int32_t increment, } } #endif #endif extern inline int32_t android_atomic_inc(volatile int32_t *addr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_inc(volatile int32_t *addr) { { return android_atomic_add(1, addr); return android_atomic_add(1, addr); } } extern inline int32_t android_atomic_dec(volatile int32_t *addr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_dec(volatile int32_t *addr) { { return android_atomic_add(-1, addr); return android_atomic_add(-1, addr); } } Loading @@ -192,7 +200,8 @@ extern inline int32_t android_atomic_dec(volatile int32_t *addr) #if defined(__thumb__) #if defined(__thumb__) extern int32_t android_atomic_and(int32_t value, volatile int32_t *ptr); extern int32_t android_atomic_and(int32_t value, volatile int32_t *ptr); #elif defined(__ARM_HAVE_LDREX_STREX) #elif defined(__ARM_HAVE_LDREX_STREX) extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) { { int32_t prev, tmp, status; int32_t prev, tmp, status; android_memory_barrier(); android_memory_barrier(); Loading @@ -208,7 +217,8 @@ extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) return prev; return prev; } } #else #else extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; android_memory_barrier(); android_memory_barrier(); Loading @@ -223,7 +233,8 @@ extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) #if defined(__thumb__) #if defined(__thumb__) extern int32_t android_atomic_or(int32_t value, volatile int32_t *ptr); extern int32_t android_atomic_or(int32_t value, volatile int32_t *ptr); #elif defined(__ARM_HAVE_LDREX_STREX) #elif defined(__ARM_HAVE_LDREX_STREX) extern inline int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) { { int32_t prev, tmp, status; int32_t prev, tmp, status; android_memory_barrier(); android_memory_barrier(); Loading @@ -239,7 +250,8 @@ extern inline int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) return prev; return prev; } } #else #else extern inline int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; android_memory_barrier(); android_memory_barrier(); Loading
include/cutils/atomic-mips.h +39 −27 Original line number Original line Diff line number Diff line Loading @@ -19,60 +19,66 @@ #include <stdint.h> #include <stdint.h> extern inline void android_compiler_barrier(void) #ifndef ANDROID_ATOMIC_INLINE #define ANDROID_ATOMIC_INLINE inline __attribute__((always_inline)) #endif extern ANDROID_ATOMIC_INLINE void android_compiler_barrier(void) { { __asm__ __volatile__ ("" : : : "memory"); __asm__ __volatile__ ("" : : : "memory"); } } #if ANDROID_SMP == 0 #if ANDROID_SMP == 0 extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { android_compiler_barrier(); android_compiler_barrier(); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { android_compiler_barrier(); android_compiler_barrier(); } } #else #else extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { __asm__ __volatile__ ("sync" : : : "memory"); __asm__ __volatile__ ("sync" : : : "memory"); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { __asm__ __volatile__ ("sync" : : : "memory"); __asm__ __volatile__ ("sync" : : : "memory"); } } #endif #endif extern inline int32_t android_atomic_acquire_load(volatile const int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_acquire_load(volatile const int32_t *ptr) { { int32_t value = *ptr; int32_t value = *ptr; android_memory_barrier(); android_memory_barrier(); return value; return value; } } extern inline int32_t android_atomic_release_load(volatile const int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_release_load(volatile const int32_t *ptr) { { android_memory_barrier(); android_memory_barrier(); return *ptr; return *ptr; } } extern inline void android_atomic_acquire_store(int32_t value, extern ANDROID_ATOMIC_INLINE void volatile int32_t *ptr) android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) { { *ptr = value; *ptr = value; android_memory_barrier(); android_memory_barrier(); } } extern inline void android_atomic_release_store(int32_t value, extern ANDROID_ATOMIC_INLINE void volatile int32_t *ptr) android_atomic_release_store(int32_t value, volatile int32_t *ptr) { { android_memory_barrier(); android_memory_barrier(); *ptr = value; *ptr = value; } } extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, extern ANDROID_ATOMIC_INLINE int volatile int32_t *ptr) android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; do { do { Loading @@ -90,7 +96,8 @@ extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, return prev != old_value; return prev != old_value; } } extern inline int android_atomic_acquire_cas(int32_t old_value, extern ANDROID_ATOMIC_INLINE int android_atomic_acquire_cas(int32_t old_value, int32_t new_value, int32_t new_value, volatile int32_t *ptr) volatile int32_t *ptr) { { Loading @@ -99,7 +106,8 @@ extern inline int android_atomic_acquire_cas(int32_t old_value, return status; return status; } } extern inline int android_atomic_release_cas(int32_t old_value, extern ANDROID_ATOMIC_INLINE int android_atomic_release_cas(int32_t old_value, int32_t new_value, int32_t new_value, volatile int32_t *ptr) volatile int32_t *ptr) { { Loading @@ -108,8 +116,8 @@ extern inline int android_atomic_release_cas(int32_t old_value, } } extern inline int32_t android_atomic_swap(int32_t new_value, extern ANDROID_ATOMIC_INLINE int32_t volatile int32_t *ptr) android_atomic_swap(int32_t new_value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; do { do { Loading @@ -125,8 +133,8 @@ extern inline int32_t android_atomic_swap(int32_t new_value, return prev; return prev; } } extern inline int32_t android_atomic_add(int32_t increment, extern ANDROID_ATOMIC_INLINE int32_t volatile int32_t *ptr) android_atomic_add(int32_t increment, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; android_memory_barrier(); android_memory_barrier(); Loading @@ -142,17 +150,20 @@ extern inline int32_t android_atomic_add(int32_t increment, return prev; return prev; } } extern inline int32_t android_atomic_inc(volatile int32_t *addr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_inc(volatile int32_t *addr) { { return android_atomic_add(1, addr); return android_atomic_add(1, addr); } } extern inline int32_t android_atomic_dec(volatile int32_t *addr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_dec(volatile int32_t *addr) { { return android_atomic_add(-1, addr); return android_atomic_add(-1, addr); } } extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; android_memory_barrier(); android_memory_barrier(); Loading @@ -168,7 +179,8 @@ extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) return prev; return prev; } } extern inline int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; android_memory_barrier(); android_memory_barrier(); Loading
include/cutils/atomic-x86.h +37 −26 Original line number Original line Diff line number Diff line Loading @@ -19,60 +19,66 @@ #include <stdint.h> #include <stdint.h> extern inline void android_compiler_barrier(void) #ifndef ANDROID_ATOMIC_INLINE #define ANDROID_ATOMIC_INLINE inline __attribute__((always_inline)) #endif extern ANDROID_ATOMIC_INLINE void android_compiler_barrier(void) { { __asm__ __volatile__ ("" : : : "memory"); __asm__ __volatile__ ("" : : : "memory"); } } #if ANDROID_SMP == 0 #if ANDROID_SMP == 0 extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { android_compiler_barrier(); android_compiler_barrier(); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { android_compiler_barrier(); android_compiler_barrier(); } } #else #else extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { { __asm__ __volatile__ ("mfence" : : : "memory"); __asm__ __volatile__ ("mfence" : : : "memory"); } } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { { android_compiler_barrier(); android_compiler_barrier(); } } #endif #endif extern inline int32_t android_atomic_acquire_load(volatile const int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_acquire_load(volatile const int32_t *ptr) { { int32_t value = *ptr; int32_t value = *ptr; android_compiler_barrier(); android_compiler_barrier(); return value; return value; } } extern inline int32_t android_atomic_release_load(volatile const int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_release_load(volatile const int32_t *ptr) { { android_memory_barrier(); android_memory_barrier(); return *ptr; return *ptr; } } extern inline void android_atomic_acquire_store(int32_t value, extern ANDROID_ATOMIC_INLINE void volatile int32_t *ptr) android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) { { *ptr = value; *ptr = value; android_memory_barrier(); android_memory_barrier(); } } extern inline void android_atomic_release_store(int32_t value, extern ANDROID_ATOMIC_INLINE void volatile int32_t *ptr) android_atomic_release_store(int32_t value, volatile int32_t *ptr) { { android_compiler_barrier(); android_compiler_barrier(); *ptr = value; *ptr = value; } } extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, extern ANDROID_ATOMIC_INLINE int volatile int32_t *ptr) android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) { { int32_t prev; int32_t prev; __asm__ __volatile__ ("lock; cmpxchgl %1, %2" __asm__ __volatile__ ("lock; cmpxchgl %1, %2" Loading @@ -82,7 +88,8 @@ extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, return prev != old_value; return prev != old_value; } } extern inline int android_atomic_acquire_cas(int32_t old_value, extern ANDROID_ATOMIC_INLINE int android_atomic_acquire_cas(int32_t old_value, int32_t new_value, int32_t new_value, volatile int32_t *ptr) volatile int32_t *ptr) { { Loading @@ -90,7 +97,8 @@ extern inline int android_atomic_acquire_cas(int32_t old_value, return android_atomic_cas(old_value, new_value, ptr); return android_atomic_cas(old_value, new_value, ptr); } } extern inline int android_atomic_release_cas(int32_t old_value, extern ANDROID_ATOMIC_INLINE int android_atomic_release_cas(int32_t old_value, int32_t new_value, int32_t new_value, volatile int32_t *ptr) volatile int32_t *ptr) { { Loading @@ -98,8 +106,8 @@ extern inline int android_atomic_release_cas(int32_t old_value, return android_atomic_cas(old_value, new_value, ptr); return android_atomic_cas(old_value, new_value, ptr); } } extern inline int32_t android_atomic_add(int32_t increment, extern ANDROID_ATOMIC_INLINE int32_t volatile int32_t *ptr) android_atomic_add(int32_t increment, volatile int32_t *ptr) { { __asm__ __volatile__ ("lock; xaddl %0, %1" __asm__ __volatile__ ("lock; xaddl %0, %1" : "+r" (increment), "+m" (*ptr) : "+r" (increment), "+m" (*ptr) Loading @@ -108,18 +116,20 @@ extern inline int32_t android_atomic_add(int32_t increment, return increment; return increment; } } extern inline int32_t android_atomic_inc(volatile int32_t *addr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_inc(volatile int32_t *addr) { { return android_atomic_add(1, addr); return android_atomic_add(1, addr); } } extern inline int32_t android_atomic_dec(volatile int32_t *addr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_dec(volatile int32_t *addr) { { return android_atomic_add(-1, addr); return android_atomic_add(-1, addr); } } extern inline int32_t android_atomic_and(int32_t value, extern ANDROID_ATOMIC_INLINE int32_t volatile int32_t *ptr) android_atomic_and(int32_t value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; do { do { Loading @@ -129,7 +139,8 @@ extern inline int32_t android_atomic_and(int32_t value, return prev; return prev; } } extern inline int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) { { int32_t prev, status; int32_t prev, status; do { do { Loading
libcutils/atomic.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -14,6 +14,6 @@ * limitations under the License. * limitations under the License. */ */ #define inline #define ANDROID_ATOMIC_INLINE #include <cutils/atomic-inline.h> #include <cutils/atomic-inline.h>