Loading include/cutils/atomic-arm.h +47 −35 Original line number Diff line number Diff line Loading @@ -20,72 +20,78 @@ #include <stdint.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"); } #if ANDROID_SMP == 0 extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { android_compiler_barrier(); } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { android_compiler_barrier(); } #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"); } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { __asm__ __volatile__ ("dmb st" : : : "memory"); } #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"); } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { android_memory_barrier(); } #else extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { typedef void (kuser_memory_barrier)(void); (*(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(); } #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; android_memory_barrier(); 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(); return *ptr; } extern inline void android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE void android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) { *ptr = value; android_memory_barrier(); } extern inline void android_atomic_release_store(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE void android_atomic_release_store(int32_t value, volatile int32_t *ptr) { android_memory_barrier(); *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, volatile int32_t *ptr); #elif defined(__ARM_HAVE_LDREX_STREX) extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) { int32_t prev, status; do { Loading @@ -111,8 +117,8 @@ extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, return prev != old_value; } #else extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int 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 *); int32_t prev, status; Loading @@ -127,7 +133,8 @@ extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, } #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, volatile int32_t *ptr) { Loading @@ -136,7 +143,8 @@ extern inline int android_atomic_acquire_cas(int32_t old_value, 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, 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, volatile int32_t *ptr); #elif defined(__ARM_HAVE_LDREX_STREX) extern inline int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) { int32_t prev, tmp, status; android_memory_barrier(); Loading @@ -166,8 +174,8 @@ extern inline int32_t android_atomic_add(int32_t increment, return prev; } #else extern inline int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) { int32_t prev, status; android_memory_barrier(); Loading @@ -179,12 +187,12 @@ extern inline int32_t android_atomic_add(int32_t increment, } #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); } 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); } Loading @@ -192,7 +200,8 @@ extern inline int32_t android_atomic_dec(volatile int32_t *addr) #if defined(__thumb__) extern int32_t android_atomic_and(int32_t value, volatile int32_t *ptr); #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; android_memory_barrier(); Loading @@ -208,7 +217,8 @@ extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) return prev; } #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; 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__) extern int32_t android_atomic_or(int32_t value, volatile int32_t *ptr); #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; android_memory_barrier(); Loading @@ -239,7 +250,8 @@ extern inline int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) return prev; } #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; android_memory_barrier(); Loading include/cutils/atomic-mips.h +39 −27 Original line number Diff line number Diff line Loading @@ -19,60 +19,66 @@ #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"); } #if ANDROID_SMP == 0 extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { android_compiler_barrier(); } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { android_compiler_barrier(); } #else extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { __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"); } #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; android_memory_barrier(); 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(); return *ptr; } extern inline void android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE void android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) { *ptr = value; android_memory_barrier(); } extern inline void android_atomic_release_store(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE void android_atomic_release_store(int32_t value, volatile int32_t *ptr) { android_memory_barrier(); *ptr = value; } extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) { int32_t prev, status; do { Loading @@ -90,7 +96,8 @@ extern inline int android_atomic_cas(int32_t old_value, int32_t new_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, volatile int32_t *ptr) { Loading @@ -99,7 +106,8 @@ extern inline int android_atomic_acquire_cas(int32_t old_value, 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, 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, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_swap(int32_t new_value, volatile int32_t *ptr) { int32_t prev, status; do { Loading @@ -125,8 +133,8 @@ extern inline int32_t android_atomic_swap(int32_t new_value, return prev; } extern inline int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) { int32_t prev, status; android_memory_barrier(); Loading @@ -142,17 +150,20 @@ extern inline int32_t android_atomic_add(int32_t increment, 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); } 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); } 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; android_memory_barrier(); Loading @@ -168,7 +179,8 @@ extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) 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; android_memory_barrier(); Loading include/cutils/atomic-x86.h +37 −26 Original line number Diff line number Diff line Loading @@ -19,60 +19,66 @@ #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"); } #if ANDROID_SMP == 0 extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { android_compiler_barrier(); } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { android_compiler_barrier(); } #else extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { __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(); } #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; android_compiler_barrier(); 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(); return *ptr; } extern inline void android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE void android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) { *ptr = value; android_memory_barrier(); } extern inline void android_atomic_release_store(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE void android_atomic_release_store(int32_t value, volatile int32_t *ptr) { android_compiler_barrier(); *ptr = value; } extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) { int32_t prev; __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; } 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, 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); } 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, 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); } extern inline int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) { __asm__ __volatile__ ("lock; xaddl %0, %1" : "+r" (increment), "+m" (*ptr) Loading @@ -108,18 +116,20 @@ extern inline int32_t android_atomic_add(int32_t 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); } 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); } 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; do { Loading @@ -129,7 +139,8 @@ extern inline int32_t android_atomic_and(int32_t value, 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; do { Loading libcutils/atomic.c +1 −1 Original line number Diff line number Diff line Loading @@ -14,6 +14,6 @@ * limitations under the License. */ #define inline #define ANDROID_ATOMIC_INLINE #include <cutils/atomic-inline.h> Loading
include/cutils/atomic-arm.h +47 −35 Original line number Diff line number Diff line Loading @@ -20,72 +20,78 @@ #include <stdint.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"); } #if ANDROID_SMP == 0 extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { android_compiler_barrier(); } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { android_compiler_barrier(); } #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"); } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { __asm__ __volatile__ ("dmb st" : : : "memory"); } #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"); } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { android_memory_barrier(); } #else extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { typedef void (kuser_memory_barrier)(void); (*(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(); } #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; android_memory_barrier(); 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(); return *ptr; } extern inline void android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE void android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) { *ptr = value; android_memory_barrier(); } extern inline void android_atomic_release_store(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE void android_atomic_release_store(int32_t value, volatile int32_t *ptr) { android_memory_barrier(); *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, volatile int32_t *ptr); #elif defined(__ARM_HAVE_LDREX_STREX) extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) { int32_t prev, status; do { Loading @@ -111,8 +117,8 @@ extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, return prev != old_value; } #else extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int 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 *); int32_t prev, status; Loading @@ -127,7 +133,8 @@ extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, } #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, volatile int32_t *ptr) { Loading @@ -136,7 +143,8 @@ extern inline int android_atomic_acquire_cas(int32_t old_value, 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, 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, volatile int32_t *ptr); #elif defined(__ARM_HAVE_LDREX_STREX) extern inline int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) { int32_t prev, tmp, status; android_memory_barrier(); Loading @@ -166,8 +174,8 @@ extern inline int32_t android_atomic_add(int32_t increment, return prev; } #else extern inline int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) { int32_t prev, status; android_memory_barrier(); Loading @@ -179,12 +187,12 @@ extern inline int32_t android_atomic_add(int32_t increment, } #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); } 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); } Loading @@ -192,7 +200,8 @@ extern inline int32_t android_atomic_dec(volatile int32_t *addr) #if defined(__thumb__) extern int32_t android_atomic_and(int32_t value, volatile int32_t *ptr); #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; android_memory_barrier(); Loading @@ -208,7 +217,8 @@ extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) return prev; } #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; 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__) extern int32_t android_atomic_or(int32_t value, volatile int32_t *ptr); #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; android_memory_barrier(); Loading @@ -239,7 +250,8 @@ extern inline int32_t android_atomic_or(int32_t value, volatile int32_t *ptr) return prev; } #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; android_memory_barrier(); Loading
include/cutils/atomic-mips.h +39 −27 Original line number Diff line number Diff line Loading @@ -19,60 +19,66 @@ #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"); } #if ANDROID_SMP == 0 extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { android_compiler_barrier(); } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { android_compiler_barrier(); } #else extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { __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"); } #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; android_memory_barrier(); 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(); return *ptr; } extern inline void android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE void android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) { *ptr = value; android_memory_barrier(); } extern inline void android_atomic_release_store(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE void android_atomic_release_store(int32_t value, volatile int32_t *ptr) { android_memory_barrier(); *ptr = value; } extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) { int32_t prev, status; do { Loading @@ -90,7 +96,8 @@ extern inline int android_atomic_cas(int32_t old_value, int32_t new_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, volatile int32_t *ptr) { Loading @@ -99,7 +106,8 @@ extern inline int android_atomic_acquire_cas(int32_t old_value, 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, 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, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_swap(int32_t new_value, volatile int32_t *ptr) { int32_t prev, status; do { Loading @@ -125,8 +133,8 @@ extern inline int32_t android_atomic_swap(int32_t new_value, return prev; } extern inline int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) { int32_t prev, status; android_memory_barrier(); Loading @@ -142,17 +150,20 @@ extern inline int32_t android_atomic_add(int32_t increment, 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); } 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); } 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; android_memory_barrier(); Loading @@ -168,7 +179,8 @@ extern inline int32_t android_atomic_and(int32_t value, volatile int32_t *ptr) 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; android_memory_barrier(); Loading
include/cutils/atomic-x86.h +37 −26 Original line number Diff line number Diff line Loading @@ -19,60 +19,66 @@ #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"); } #if ANDROID_SMP == 0 extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { android_compiler_barrier(); } extern inline void android_memory_store_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_store_barrier(void) { android_compiler_barrier(); } #else extern inline void android_memory_barrier(void) extern ANDROID_ATOMIC_INLINE void android_memory_barrier(void) { __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(); } #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; android_compiler_barrier(); 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(); return *ptr; } extern inline void android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE void android_atomic_acquire_store(int32_t value, volatile int32_t *ptr) { *ptr = value; android_memory_barrier(); } extern inline void android_atomic_release_store(int32_t value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE void android_atomic_release_store(int32_t value, volatile int32_t *ptr) { android_compiler_barrier(); *ptr = value; } extern inline int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int android_atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t *ptr) { int32_t prev; __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; } 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, 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); } 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, 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); } extern inline int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) extern ANDROID_ATOMIC_INLINE int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr) { __asm__ __volatile__ ("lock; xaddl %0, %1" : "+r" (increment), "+m" (*ptr) Loading @@ -108,18 +116,20 @@ extern inline int32_t android_atomic_add(int32_t 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); } 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); } 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; do { Loading @@ -129,7 +139,8 @@ extern inline int32_t android_atomic_and(int32_t value, 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; do { Loading
libcutils/atomic.c +1 −1 Original line number Diff line number Diff line Loading @@ -14,6 +14,6 @@ * limitations under the License. */ #define inline #define ANDROID_ATOMIC_INLINE #include <cutils/atomic-inline.h>