diff --git a/include/nuttx/atomic.h b/include/nuttx/atomic.h index cce19fbe4e5..53b24b02a11 100644 --- a/include/nuttx/atomic.h +++ b/include/nuttx/atomic.h @@ -73,8 +73,6 @@ extern "C++" # define __ATOMIC_ACQ_REL 4 # define __ATOMIC_SEQ_CST 5 -# define USE_ARCH_ATOMIC 1 - # define ATOMIC_FUNC(f, n) nx_atomic_##f##_##n # define nx_atomic_compare_exchange_weak_4(obj, expect, desired, success, failure) \ @@ -104,6 +102,7 @@ typedef volatile int64_t atomic64_t; #define atomic64_read(obj) ATOMIC_FUNC(load, 8)(obj, __ATOMIC_RELAXED) #define atomic64_read_acquire(obj) ATOMIC_FUNC(load, 8)(obj, __ATOMIC_ACQUIRE) +#define atomic_fetch_add(obj, val) ATOMIC_FUNC(fetch_add, 4)(obj, val, __ATOMIC_ACQ_REL) #define atomic_fetch_add_acquire(obj, val) ATOMIC_FUNC(fetch_add, 4)(obj, val, __ATOMIC_ACQUIRE) #define atomic_fetch_add_release(obj, val) ATOMIC_FUNC(fetch_add, 4)(obj, val, __ATOMIC_RELEASE) #define atomic_fetch_add_relaxed(obj, val) ATOMIC_FUNC(fetch_add, 4)(obj, val, __ATOMIC_RELAXED) @@ -112,6 +111,7 @@ typedef volatile int64_t atomic64_t; #define atomic64_fetch_add_release(obj, val) ATOMIC_FUNC(fetch_add, 8)(obj, val, __ATOMIC_RELEASE) #define atomic64_fetch_add_relaxed(obj, val) ATOMIC_FUNC(fetch_add, 8)(obj, val, __ATOMIC_RELAXED) +#define atomic_fetch_sub(obj, val) ATOMIC_FUNC(fetch_sub, 4)(obj, val, __ATOMIC_ACQ_REL) #define atomic_fetch_sub_acquire(obj, val) ATOMIC_FUNC(fetch_sub, 4)(obj, val, __ATOMIC_ACQUIRE) #define atomic_fetch_sub_release(obj, val) ATOMIC_FUNC(fetch_sub, 4)(obj, val, __ATOMIC_RELEASE) #define atomic_fetch_sub_relaxed(obj, val) ATOMIC_FUNC(fetch_sub, 4)(obj, val, __ATOMIC_RELAXED) @@ -120,6 +120,7 @@ typedef volatile int64_t atomic64_t; #define atomic64_fetch_sub_release(obj, val) ATOMIC_FUNC(fetch_sub, 8)(obj, val, __ATOMIC_RELEASE) #define atomic64_fetch_sub_relaxed(obj, val) ATOMIC_FUNC(fetch_sub, 8)(obj, val, __ATOMIC_RELAXED) +#define atomic_fetch_and(obj, val) ATOMIC_FUNC(fetch_and, 4)(obj, val, __ATOMIC_ACQ_REL) #define atomic_fetch_and_acquire(obj, val) ATOMIC_FUNC(fetch_and, 4)(obj, val, __ATOMIC_ACQUIRE) #define atomic_fetch_and_release(obj, val) ATOMIC_FUNC(fetch_and, 4)(obj, val, __ATOMIC_RELEASE) #define atomic_fetch_and_relaxed(obj, val) ATOMIC_FUNC(fetch_and, 4)(obj, val, __ATOMIC_RELAXED) @@ -128,6 +129,7 @@ typedef volatile int64_t atomic64_t; #define atomic64_fetch_and_release(obj, val) ATOMIC_FUNC(fetch_and, 8)(obj, val, __ATOMIC_RELEASE) #define atomic64_fetch_and_relaxed(obj, val) ATOMIC_FUNC(fetch_and, 8)(obj, val, __ATOMIC_RELAXED) +#define atomic_fetch_or(obj, val) ATOMIC_FUNC(fetch_or, 4)(obj, val, __ATOMIC_ACQ_REL) #define atomic_fetch_or_acquire(obj, val) ATOMIC_FUNC(fetch_or, 4)(obj, val, __ATOMIC_ACQUIRE) #define atomic_fetch_or_release(obj, val) ATOMIC_FUNC(fetch_or, 4)(obj, val, __ATOMIC_RELEASE) #define atomic_fetch_or_relaxed(obj, val) ATOMIC_FUNC(fetch_or, 4)(obj, val, __ATOMIC_RELAXED) @@ -136,6 +138,7 @@ typedef volatile int64_t atomic64_t; #define atomic64_fetch_or_release(obj, val) ATOMIC_FUNC(fetch_or, 8)(obj, val, __ATOMIC_RELEASE) #define atomic64_fetch_or_relaxed(obj, val) ATOMIC_FUNC(fetch_or, 8)(obj, val, __ATOMIC_RELAXED) +#define atomic_fetch_xor(obj, val) ATOMIC_FUNC(fetch_xor, 4)(obj, val, __ATOMIC_ACQ_REL) #define atomic_fetch_xor_acquire(obj, val) ATOMIC_FUNC(fetch_xor, 4)(obj, val, __ATOMIC_ACQUIRE) #define atomic_fetch_xor_release(obj, val) ATOMIC_FUNC(fetch_xor, 4)(obj, val, __ATOMIC_RELEASE) #define atomic_fetch_xor_relaxed(obj, val) ATOMIC_FUNC(fetch_xor, 4)(obj, val, __ATOMIC_RELAXED) @@ -161,6 +164,7 @@ typedef volatile int64_t atomic64_t; ATOMIC_FUNC(compare_exchange_strong, 4)(obj, (FAR int32_t *)expected, desired, __ATOMIC_RELEASE, __ATOMIC_RELAXED) #define atomic_cmpxchg_relaxed(obj, expected, desired) \ ATOMIC_FUNC(compare_exchange_strong, 4)(obj, (FAR int32_t *)expected, desired, __ATOMIC_RELAXED, __ATOMIC_RELAXED) + #define atomic_try_cmpxchg(obj, expected, desired) \ ATOMIC_FUNC(compare_exchange_weak, 4)(obj, (FAR int32_t *)expected, desired, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED) #define atomic_try_cmpxchg_acquire(obj, expected, desired) \ @@ -169,6 +173,7 @@ typedef volatile int64_t atomic64_t; ATOMIC_FUNC(compare_exchange_weak, 4)(obj, (FAR int32_t *)expected, desired, __ATOMIC_RELEASE, __ATOMIC_RELAXED) #define atomic_try_cmpxchg_relaxed(obj, expected, desired) \ ATOMIC_FUNC(compare_exchange_weak, 4)(obj, (FAR int32_t *)expected, desired, __ATOMIC_RELAXED, __ATOMIC_RELAXED) + #define atomic64_cmpxchg(obj, expected, desired) \ ATOMIC_FUNC(compare_exchange_strong, 8)(obj, (FAR int64_t *)expected, desired, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED) #define atomic64_cmpxchg_acquire(obj, expected, desired) \ @@ -177,6 +182,7 @@ typedef volatile int64_t atomic64_t; ATOMIC_FUNC(compare_exchange_strong, 8)(obj, (FAR int64_t *)expected, desired, __ATOMIC_RELEASE, __ATOMIC_RELAXED) #define atomic64_cmpxchg_relaxed(obj, expected, desired) \ ATOMIC_FUNC(compare_exchange_strong, 8)(obj, (FAR int64_t *)expected, desired, __ATOMIC_RELAXED, __ATOMIC_RELAXED) + #define atomic64_try_cmpxchg(obj, expected, desired) \ ATOMIC_FUNC(compare_exchange_weak, 8)(obj, (FAR int64_t *)expected, desired, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED) #define atomic64_try_cmpxchg_acquire(obj, expected, desired) \ @@ -234,33 +240,6 @@ int32_t nx_atomic_fetch_xor_4(FAR volatile void *ptr, int32_t value, int64_t nx_atomic_fetch_xor_8(FAR volatile void *ptr, int64_t value, int memorder); -#ifdef USE_ARCH_ATOMIC -static inline int32_t atomic_fetch_add(FAR volatile void *obj, int32_t val) -{ - return nx_atomic_fetch_add_4(obj, val, __ATOMIC_ACQ_REL); -} - -static inline int32_t atomic_fetch_sub(FAR volatile void *obj, int32_t val) -{ - return nx_atomic_fetch_sub_4(obj, val, __ATOMIC_ACQ_REL); -} - -static inline int32_t atomic_fetch_and(FAR volatile void *obj, int32_t val) -{ - return nx_atomic_fetch_and_4(obj, val, __ATOMIC_ACQ_REL); -} - -static inline int32_t atomic_fetch_or(FAR volatile void *obj, int32_t val) -{ - return nx_atomic_fetch_or_4(obj, val, __ATOMIC_ACQ_REL); -} - -static inline int32_t atomic_fetch_xor(FAR volatile void *obj, int32_t val) -{ - return nx_atomic_fetch_xor_4(obj, val, __ATOMIC_ACQ_REL); -} -#endif - #undef EXTERN #if defined(__cplusplus) }