diff --git a/include/nuttx/atomic.h b/include/nuttx/atomic.h index d2ea13d9e44..9f466ff7dd4 100644 --- a/include/nuttx/atomic.h +++ b/include/nuttx/atomic.h @@ -29,53 +29,9 @@ #include -#define NEED_ATOMIC_MACROS -#if defined(__has_include) -# if __has_include() && defined(__cplusplus) -# undef NEED_ATOMIC_MACROS -# endif -#endif - -#if defined(CONFIG_LIBC_ATOMIC_TOOLCHAIN) -# if __has_include() && defined(__cplusplus) -extern "C++" -{ -# include -# define ATOMIC_FUNC(f, n) atomic_##f##_explicit - - using std::atomic_load_explicit; - using std::atomic_store_explicit; - using std::atomic_exchange_explicit; - using std::atomic_compare_exchange_strong_explicit; - using std::atomic_compare_exchange_weak_explicit; - using std::atomic_fetch_add_explicit; - using std::atomic_fetch_sub_explicit; - using std::atomic_fetch_and_explicit; - using std::atomic_fetch_or_explicit; - using std::atomic_fetch_xor_explicit; - - typedef volatile int32_t atomic_t; - typedef volatile int64_t atomic64_t; -} -# elif ((defined(__cplusplus) && __cplusplus >= 201103L) || \ - (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L)) && \ - !defined(__STDC_NO_ATOMICS__) -# if !defined(__clang__) && defined(__cplusplus) -# define _Atomic -# endif -# include -# define ATOMIC_FUNC(f, n) atomic_##f##_explicit - -# if defined(__cplusplus) -# define __auto_type auto -typedef _Atomic int32_t atomic_t; -typedef _Atomic int64_t atomic64_t; -# else -typedef volatile _Atomic int32_t atomic_t; -typedef volatile _Atomic int64_t atomic64_t; -# endif -# endif -#endif +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ #ifndef __ATOMIC_RELAXED # define __ATOMIC_RELAXED 0 @@ -101,130 +57,111 @@ typedef volatile _Atomic int64_t atomic64_t; # define __ATOMIC_SEQ_CST 5 #endif -#ifndef ATOMIC_FUNC +#define atomic_set(obj, val) atomic_store_4(obj, val, __ATOMIC_RELAXED) +#define atomic_set_release(obj, val) atomic_store_4(obj, val, __ATOMIC_RELEASE) +#define atomic64_set(obj, val) atomic_store_8(obj, val, __ATOMIC_RELAXED) +#define atomic64_set_release(obj, val) atomic_store_8(obj, val, __ATOMIC_RELEASE) -# define ATOMIC_FUNC(f, n) nx_atomic_##f##_##n +#define atomic_read(obj) atomic_load_4(obj, __ATOMIC_RELAXED) +#define atomic_read_acquire(obj) atomic_load_4(obj, __ATOMIC_ACQUIRE) +#define atomic64_read(obj) atomic_load_8(obj, __ATOMIC_RELAXED) +#define atomic64_read_acquire(obj) atomic_load_8(obj, __ATOMIC_ACQUIRE) -# define nx_atomic_compare_exchange_weak_4(obj, expect, desired, success, failure) \ - nx_atomic_compare_exchange_4(obj, expect, desired, true, success, failure) -# define nx_atomic_compare_exchange_weak_8(obj, expect, desired, success, failure) \ - nx_atomic_compare_exchange_8(obj, expect, desired, true, success, failure) -# define nx_atomic_compare_exchange_strong_4(obj, expect, desired, success, failure) \ - nx_atomic_compare_exchange_4(obj, expect, desired, false, success, failure) -# define nx_atomic_compare_exchange_strong_8(obj, expect, desired, success, failure) \ - nx_atomic_compare_exchange_8(obj, expect, desired, false, success, failure) +#define atomic_add(obj, val) atomic_fetch_add_4(obj, val, __ATOMIC_ACQ_REL) +#define atomic_add_acquire(obj, val) atomic_fetch_add_4(obj, val, __ATOMIC_ACQUIRE) +#define atomic_add_release(obj, val) atomic_fetch_add_4(obj, val, __ATOMIC_RELEASE) +#define atomic_add_relaxed(obj, val) atomic_fetch_add_4(obj, val, __ATOMIC_RELAXED) +#define atomic64_add(obj, val) atomic_fetch_add_8(obj, val, __ATOMIC_ACQ_REL) +#define atomic64_add_acquire(obj, val) atomic_fetch_add_8(obj, val, __ATOMIC_ACQUIRE) +#define atomic64_add_release(obj, val) atomic_fetch_add_8(obj, val, __ATOMIC_RELEASE) +#define atomic64_add_relaxed(obj, val) atomic_fetch_add_8(obj, val, __ATOMIC_RELAXED) + +#define atomic_sub(obj, val) atomic_fetch_sub_4(obj, val, __ATOMIC_ACQ_REL) +#define atomic_sub_acquire(obj, val) atomic_fetch_sub_4(obj, val, __ATOMIC_ACQUIRE) +#define atomic_sub_release(obj, val) atomic_fetch_sub_4(obj, val, __ATOMIC_RELEASE) +#define atomic_sub_relaxed(obj, val) atomic_fetch_sub_4(obj, val, __ATOMIC_RELAXED) +#define atomic64_sub(obj, val) atomic_fetch_sub_8(obj, val, __ATOMIC_ACQ_REL) +#define atomic64_sub_acquire(obj, val) atomic_fetch_sub_8(obj, val, __ATOMIC_ACQUIRE) +#define atomic64_sub_release(obj, val) atomic_fetch_sub_8(obj, val, __ATOMIC_RELEASE) +#define atomic64_sub_relaxed(obj, val) atomic_fetch_sub_8(obj, val, __ATOMIC_RELAXED) + +#define atomic_and(obj, val) atomic_fetch_and_4(obj, val, __ATOMIC_ACQ_REL) +#define atomic_and_acquire(obj, val) atomic_fetch_and_4(obj, val, __ATOMIC_ACQUIRE) +#define atomic_and_release(obj, val) atomic_fetch_and_4(obj, val, __ATOMIC_RELEASE) +#define atomic_and_relaxed(obj, val) atomic_fetch_and_4(obj, val, __ATOMIC_RELAXED) +#define atomic64_and(obj, val) atomic_fetch_and_8(obj, val, __ATOMIC_ACQ_REL) +#define atomic64_and_acquire(obj, val) atomic_fetch_and_8(obj, val, __ATOMIC_ACQUIRE) +#define atomic64_and_release(obj, val) atomic_fetch_and_8(obj, val, __ATOMIC_RELEASE) +#define atomic64_and_relaxed(obj, val) atomic_fetch_and_8(obj, val, __ATOMIC_RELAXED) + +#define atomic_or(obj, val) atomic_fetch_or_4(obj, val, __ATOMIC_ACQ_REL) +#define atomic_or_acquire(obj, val) atomic_fetch_or_4(obj, val, __ATOMIC_ACQUIRE) +#define atomic_or_release(obj, val) atomic_fetch_or_4(obj, val, __ATOMIC_RELEASE) +#define atomic_or_relaxed(obj, val) atomic_fetch_or_4(obj, val, __ATOMIC_RELAXED) +#define atomic64_or(obj, val) atomic_fetch_or_8(obj, val, __ATOMIC_ACQ_REL) +#define atomic64_or_acquire(obj, val) atomic_fetch_or_8(obj, val, __ATOMIC_ACQUIRE) +#define atomic64_or_release(obj, val) atomic_fetch_or_8(obj, val, __ATOMIC_RELEASE) +#define atomic64_or_relaxed(obj, val) atomic_fetch_or_8(obj, val, __ATOMIC_RELAXED) + +#define atomic_xor(obj, val) atomic_fetch_xor_4(obj, val, __ATOMIC_ACQ_REL) +#define atomic_xor_acquire(obj, val) atomic_fetch_xor_4(obj, val, __ATOMIC_ACQUIRE) +#define atomic_xor_release(obj, val) atomic_fetch_xor_4(obj, val, __ATOMIC_RELEASE) +#define atomic_xor_relaxed(obj, val) atomic_fetch_xor_4(obj, val, __ATOMIC_RELAXED) +#define atomic64_xor(obj, val) atomic_fetch_xor_8(obj, val, __ATOMIC_ACQ_REL) +#define atomic64_xor_acquire(obj, val) atomic_fetch_xor_8(obj, val, __ATOMIC_ACQUIRE) +#define atomic64_xor_release(obj, val) atomic_fetch_xor_8(obj, val, __ATOMIC_RELEASE) +#define atomic64_xor_relaxed(obj, val) atomic_fetch_xor_8(obj, val, __ATOMIC_RELAXED) + +#define atomic_xchg(obj, val) atomic_exchange_4(obj, val, __ATOMIC_ACQ_REL) +#define atomic_xchg_acquire(obj, val) atomic_exchange_4(obj, val, __ATOMIC_ACQUIRE) +#define atomic_xchg_release(obj, val) atomic_exchange_4(obj, val, __ATOMIC_RELEASE) +#define atomic_xchg_relaxed(obj, val) atomic_exchange_4(obj, val, __ATOMIC_RELAXED) +#define atomic64_xchg(obj, val) atomic_exchange_8(obj, val, __ATOMIC_ACQ_REL) +#define atomic64_xchg_acquire(obj, val) atomic_exchange_8(obj, val, __ATOMIC_ACQUIRE) +#define atomic64_xchg_release(obj, val) atomic_exchange_8(obj, val, __ATOMIC_RELEASE) +#define atomic64_xchg_relaxed(obj, val) atomic_exchange_8(obj, val, __ATOMIC_RELAXED) + +#define atomic_cmpxchg(obj, expected, desired) \ + atomic_compare_exchange_4(obj, (FAR int32_t *)expected, desired, false, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED) +#define atomic_cmpxchg_acquire(obj, expected, desired) \ + atomic_compare_exchange_4(obj, (FAR int32_t *)expected, desired, false, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED) +#define atomic_cmpxchg_release(obj, expected, desired) \ + atomic_compare_exchange_4(obj, (FAR int32_t *)expected, desired, false, __ATOMIC_RELEASE, __ATOMIC_RELAXED) +#define atomic_cmpxchg_relaxed(obj, expected, desired) \ + atomic_compare_exchange_4(obj, (FAR int32_t *)expected, desired, false, __ATOMIC_RELAXED, __ATOMIC_RELAXED) +#define atomic64_cmpxchg(obj, expected, desired) \ + atomic_compare_exchange_8(obj, (FAR int64_t *)expected, desired, false, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED) +#define atomic64_cmpxchg_acquire(obj, expected, desired) \ + atomic_compare_exchange_8(obj, (FAR int64_t *)expected, desired, false, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED) +#define atomic64_cmpxchg_release(obj, expected, desired) \ + atomic_compare_exchange_8(obj, (FAR int64_t *)expected, desired, false, __ATOMIC_RELEASE, __ATOMIC_RELAXED) +#define atomic64_cmpxchg_relaxed(obj, expected, desired) \ + atomic_compare_exchange_8(obj, (FAR int64_t *)expected, desired, false, __ATOMIC_RELAXED, __ATOMIC_RELAXED) + +#define atomic_try_cmpxchg(obj, expected, desired) \ + atomic_compare_exchange_4(obj, (FAR int32_t *)expected, desired, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED) +#define atomic_try_cmpxchg_acquire(obj, expected, desired) \ + atomic_compare_exchange_4(obj, (FAR int32_t *)expected, desired, true, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED) +#define atomic_try_cmpxchg_release(obj, expected, desired) \ + atomic_compare_exchange_4(obj, (FAR int32_t *)expected, desired, true, __ATOMIC_RELEASE, __ATOMIC_RELAXED) +#define atomic_try_cmpxchg_relaxed(obj, expected, desired) \ + atomic_compare_exchange_4(obj, (FAR int32_t *)expected, desired, true, __ATOMIC_RELAXED, __ATOMIC_RELAXED) +#define atomic64_try_cmpxchg(obj, expected, desired) \ + atomic_compare_exchange_8(obj, (FAR int64_t *)expected, desired, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED) +#define atomic64_try_cmpxchg_acquire(obj, expected, desired) \ + atomic_compare_exchange_8(obj, (FAR int64_t *)expected, desired, true, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED) +#define atomic64_try_cmpxchg_release(obj, expected, desired) \ + atomic_compare_exchange_8(obj, (FAR int64_t *)expected, desired, true, __ATOMIC_RELEASE, __ATOMIC_RELAXED) +#define atomic64_try_cmpxchg_relaxed(obj, expected, desired) \ + atomic_compare_exchange_8(obj, (FAR int64_t *)expected, desired, true, __ATOMIC_RELAXED, __ATOMIC_RELAXED) + +/**************************************************************************** + * Public Types + ****************************************************************************/ typedef volatile int32_t atomic_t; typedef volatile int64_t atomic64_t; -#endif -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -#ifdef NEED_ATOMIC_MACROS - -#define atomic_set(obj, val) ATOMIC_FUNC(store, 4)(obj, val, __ATOMIC_RELAXED) -#define atomic_set_release(obj, val) ATOMIC_FUNC(store, 4)(obj, val, __ATOMIC_RELEASE) -#define atomic64_set(obj, val) ATOMIC_FUNC(store, 8)(obj, val, __ATOMIC_RELAXED) -#define atomic64_set_release(obj, val) ATOMIC_FUNC(store, 8)(obj, val, __ATOMIC_RELEASE) - -#define atomic_read(obj) ATOMIC_FUNC(load, 4)(obj, __ATOMIC_RELAXED) -#define atomic_read_acquire(obj) ATOMIC_FUNC(load, 4)(obj, __ATOMIC_ACQUIRE) -#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) -#define atomic64_fetch_add(obj, val) ATOMIC_FUNC(fetch_add, 8)(obj, val, __ATOMIC_ACQ_REL) -#define atomic64_fetch_add_acquire(obj, val) ATOMIC_FUNC(fetch_add, 8)(obj, val, __ATOMIC_ACQUIRE) -#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) -#define atomic64_fetch_sub(obj, val) ATOMIC_FUNC(fetch_sub, 8)(obj, val, __ATOMIC_ACQ_REL) -#define atomic64_fetch_sub_acquire(obj, val) ATOMIC_FUNC(fetch_sub, 8)(obj, val, __ATOMIC_ACQUIRE) -#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) -#define atomic64_fetch_and(obj, val) ATOMIC_FUNC(fetch_and, 8)(obj, val, __ATOMIC_ACQ_REL) -#define atomic64_fetch_and_acquire(obj, val) ATOMIC_FUNC(fetch_and, 8)(obj, val, __ATOMIC_ACQUIRE) -#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) -#define atomic64_fetch_or(obj, val) ATOMIC_FUNC(fetch_or, 8)(obj, val, __ATOMIC_ACQ_REL) -#define atomic64_fetch_or_acquire(obj, val) ATOMIC_FUNC(fetch_or, 8)(obj, val, __ATOMIC_ACQUIRE) -#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) -#define atomic64_fetch_xor(obj, val) ATOMIC_FUNC(fetch_xor, 8)(obj, val, __ATOMIC_ACQ_REL) -#define atomic64_fetch_xor_acquire(obj, val) ATOMIC_FUNC(fetch_xor, 8)(obj, val, __ATOMIC_ACQUIRE) -#define atomic64_fetch_xor_release(obj, val) ATOMIC_FUNC(fetch_xor, 8)(obj, val, __ATOMIC_RELEASE) -#define atomic64_fetch_xor_relaxed(obj, val) ATOMIC_FUNC(fetch_xor, 8)(obj, val, __ATOMIC_RELAXED) - -#define atomic_xchg(obj, val) ATOMIC_FUNC(exchange, 4)(obj, val, __ATOMIC_ACQ_REL) -#define atomic_xchg_acquire(obj, val) ATOMIC_FUNC(exchange, 4)(obj, val, __ATOMIC_ACQUIRE) -#define atomic_xchg_release(obj, val) ATOMIC_FUNC(exchange, 4)(obj, val, __ATOMIC_RELEASE) -#define atomic_xchg_relaxed(obj, val) ATOMIC_FUNC(exchange, 4)(obj, val, __ATOMIC_RELAXED) -#define atomic64_xchg(obj, val) ATOMIC_FUNC(exchange, 8)(obj, val, __ATOMIC_ACQ_REL) -#define atomic64_xchg_acquire(obj, val) ATOMIC_FUNC(exchange, 8)(obj, val, __ATOMIC_ACQUIRE) -#define atomic64_xchg_release(obj, val) ATOMIC_FUNC(exchange, 8)(obj, val, __ATOMIC_RELEASE) -#define atomic64_xchg_relaxed(obj, val) ATOMIC_FUNC(exchange, 8)(obj, val, __ATOMIC_RELAXED) - -#define atomic_cmpxchg(obj, expected, desired) \ - ATOMIC_FUNC(compare_exchange_strong, 4)(obj, (FAR int32_t *)expected, desired, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED) -#define atomic_cmpxchg_acquire(obj, expected, desired) \ - ATOMIC_FUNC(compare_exchange_strong, 4)(obj, (FAR int32_t *)expected, desired, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED) -#define atomic_cmpxchg_release(obj, expected, desired) \ - 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) \ - ATOMIC_FUNC(compare_exchange_weak, 4)(obj, (FAR int32_t *)expected, desired, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED) -#define atomic_try_cmpxchg_release(obj, expected, desired) \ - 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) \ - ATOMIC_FUNC(compare_exchange_strong, 8)(obj, (FAR int64_t *)expected, desired, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED) -#define atomic64_cmpxchg_release(obj, expected, desired) \ - 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) \ - ATOMIC_FUNC(compare_exchange_weak, 8)(obj, (FAR int64_t *)expected, desired, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED) -#define atomic64_try_cmpxchg_release(obj, expected, desired) \ - ATOMIC_FUNC(compare_exchange_weak, 8)(obj, (FAR int64_t *)expected, desired, __ATOMIC_RELEASE, __ATOMIC_RELAXED) -#define atomic64_try_cmpxchg_relaxed(obj, expected, desired) \ - ATOMIC_FUNC(compare_exchange_weak, 8)(obj, (FAR int64_t *)expected, desired, __ATOMIC_RELAXED, __ATOMIC_RELAXED) - -#endif /**************************************************************************** * Public Function Prototypes @@ -239,40 +176,44 @@ extern "C" #define EXTERN extern #endif -void nx_atomic_store_4(FAR volatile void *ptr, int32_t value, int memorder); -void nx_atomic_store_8(FAR volatile void *ptr, int64_t value, int memorder); -int32_t nx_atomic_load_4(FAR const volatile void *ptr, int memorder); -int64_t nx_atomic_load_8(FAR const volatile void *ptr, int memorder); -int32_t nx_atomic_exchange_4(FAR volatile void *ptr, int32_t value, - int memorder); -int64_t nx_atomic_exchange_8(FAR volatile void *ptr, int64_t value, - int memorder); -bool nx_atomic_compare_exchange_4(FAR volatile void *ptr, FAR void *expect, - int32_t desired, bool weak, - int success, int failure); -bool nx_atomic_compare_exchange_8(FAR volatile void *ptr, FAR void *expect, - int64_t desired, bool weak, - int success, int failure); -int32_t nx_atomic_fetch_add_4(FAR volatile void *ptr, int32_t value, - int memorder); -int64_t nx_atomic_fetch_add_8(FAR volatile void *ptr, int64_t value, - int memorder); -int32_t nx_atomic_fetch_sub_4(FAR volatile void *ptr, int32_t value, - int memorder); -int64_t nx_atomic_fetch_sub_8(FAR volatile void *ptr, int64_t value, - int memorder); -int32_t nx_atomic_fetch_and_4(FAR volatile void *ptr, int32_t value, - int memorder); -int64_t nx_atomic_fetch_and_8(FAR volatile void *ptr, int64_t value, - int memorder); -int32_t nx_atomic_fetch_or_4(FAR volatile void *ptr, int32_t value, - int memorder); -int64_t nx_atomic_fetch_or_8(FAR volatile void *ptr, int64_t value, - int memorder); -int32_t nx_atomic_fetch_xor_4(FAR volatile void *ptr, int32_t value, - int memorder); -int64_t nx_atomic_fetch_xor_8(FAR volatile void *ptr, int64_t value, - int memorder); +#ifndef CONFIG_LIBC_ATOMIC_TOOLCHAIN +void atomic_store_4(FAR volatile void *ptr, int32_t value, int memorder); +void atomic_store_8(FAR volatile void *ptr, int64_t value, int memorder); +int32_t atomic_load_4(FAR const volatile void *ptr, int memorder); +int64_t atomic_load_8(FAR const volatile void *ptr, int memorder); +int32_t atomic_exchange_4(FAR volatile void *ptr, int32_t value, + int memorder); +int64_t atomic_exchange_8(FAR volatile void *ptr, int64_t value, + int memorder); +bool atomic_compare_exchange_4(FAR volatile void *ptr, + FAR volatile void *expect, + int32_t desired, bool weak, + int success, int failure); +bool atomic_compare_exchange_8(FAR volatile void *ptr, + FAR volatile void *expect, + int64_t desired, bool weak, + int success, int failure); +int32_t atomic_fetch_add_4(FAR volatile void *ptr, int32_t value, + int memorder); +int64_t atomic_fetch_add_8(FAR volatile void *ptr, int64_t value, + int memorder); +int32_t atomic_fetch_sub_4(FAR volatile void *ptr, int32_t value, + int memorder); +int64_t atomic_fetch_sub_8(FAR volatile void *ptr, int64_t value, + int memorder); +int32_t atomic_fetch_and_4(FAR volatile void *ptr, int32_t value, + int memorder); +int64_t atomic_fetch_and_8(FAR volatile void *ptr, int64_t value, + int memorder); +int32_t atomic_fetch_or_4(FAR volatile void *ptr, int32_t value, + int memorder); +int64_t atomic_fetch_or_8(FAR volatile void *ptr, int64_t value, + int memorder); +int32_t atomic_fetch_xor_4(FAR volatile void *ptr, int32_t value, + int memorder); +int64_t atomic_fetch_xor_8(FAR volatile void *ptr, int64_t value, + int memorder); +#endif #undef EXTERN #if defined(__cplusplus) diff --git a/libs/libc/machine/arch_atomic64.c b/libs/libc/machine/arch_atomic64.c index 5b222915fdb..41cdeafeaf0 100644 --- a/libs/libc/machine/arch_atomic64.c +++ b/libs/libc/machine/arch_atomic64.c @@ -60,7 +60,7 @@ static inline void atomic_unlock(irqstate_t flags) STORE(__atomic_store_, 8, uint64_t) #ifndef CONFIG_LIBC_ATOMIC_TOOLCHAIN -STORE(nx_atomic_store_, 8, int64_t) +STORE(atomic_store_, 8, int64_t) #endif /**************************************************************************** @@ -69,7 +69,7 @@ STORE(nx_atomic_store_, 8, int64_t) LOAD(__atomic_load_, 8, uint64_t) #ifndef CONFIG_LIBC_ATOMIC_TOOLCHAIN -LOAD(nx_atomic_load_, 8, int64_t) +LOAD(atomic_load_, 8, int64_t) #endif /**************************************************************************** @@ -78,7 +78,7 @@ LOAD(nx_atomic_load_, 8, int64_t) EXCHANGE(__atomic_exchange_, 8, uint64_t) #ifndef CONFIG_LIBC_ATOMIC_TOOLCHAIN -EXCHANGE(nx_atomic_exchange_, 8, int64_t) +EXCHANGE(atomic_exchange_, 8, int64_t) #endif /**************************************************************************** @@ -87,7 +87,7 @@ EXCHANGE(nx_atomic_exchange_, 8, int64_t) CMP_EXCHANGE(__atomic_compare_exchange_, 8, uint64_t) #ifndef CONFIG_LIBC_ATOMIC_TOOLCHAIN -CMP_EXCHANGE(nx_atomic_compare_exchange_, 8, int64_t) +CMP_EXCHANGE(atomic_compare_exchange_, 8, int64_t) #endif /**************************************************************************** @@ -96,7 +96,7 @@ CMP_EXCHANGE(nx_atomic_compare_exchange_, 8, int64_t) FLAG_TEST_AND_SET(__atomic_flags_test_and_set_, 8, uint64_t) #ifndef CONFIG_LIBC_ATOMIC_TOOLCHAIN -FLAG_TEST_AND_SET(nx_atomic_flags_test_and_set_, 8, int64_t) +FLAG_TEST_AND_SET(atomic_flags_test_and_set_, 8, int64_t) #endif /**************************************************************************** @@ -105,7 +105,7 @@ FLAG_TEST_AND_SET(nx_atomic_flags_test_and_set_, 8, int64_t) FETCH_ADD(__atomic_fetch_add_, 8, uint64_t) #ifndef CONFIG_LIBC_ATOMIC_TOOLCHAIN -FETCH_ADD(nx_atomic_fetch_add_, 8, int64_t) +FETCH_ADD(atomic_fetch_add_, 8, int64_t) #endif /**************************************************************************** @@ -114,7 +114,7 @@ FETCH_ADD(nx_atomic_fetch_add_, 8, int64_t) FETCH_SUB(__atomic_fetch_sub_, 8, uint64_t) #ifndef CONFIG_LIBC_ATOMIC_TOOLCHAIN -FETCH_SUB(nx_atomic_fetch_sub_, 8, int64_t) +FETCH_SUB(atomic_fetch_sub_, 8, int64_t) #endif /**************************************************************************** @@ -123,7 +123,7 @@ FETCH_SUB(nx_atomic_fetch_sub_, 8, int64_t) FETCH_AND(__atomic_fetch_and_, 8, uint64_t) #ifndef CONFIG_LIBC_ATOMIC_TOOLCHAIN -FETCH_AND(nx_atomic_fetch_and_, 8, int64_t) +FETCH_AND(atomic_fetch_and_, 8, int64_t) #endif /**************************************************************************** @@ -132,7 +132,7 @@ FETCH_AND(nx_atomic_fetch_and_, 8, int64_t) FETCH_OR(__atomic_fetch_or_, 8, uint64_t) #ifndef CONFIG_LIBC_ATOMIC_TOOLCHAIN -FETCH_OR(nx_atomic_fetch_or_, 8, int64_t) +FETCH_OR(atomic_fetch_or_, 8, int64_t) #endif /**************************************************************************** @@ -141,7 +141,7 @@ FETCH_OR(nx_atomic_fetch_or_, 8, int64_t) FETCH_XOR(__atomic_fetch_xor_, 8, uint64_t) #ifndef CONFIG_LIBC_ATOMIC_TOOLCHAIN -FETCH_XOR(nx_atomic_fetch_xor_, 8, int64_t) +FETCH_XOR(atomic_fetch_xor_, 8, int64_t) #endif /* Clang define the __sync builtins, add #ifndef to avoid diff --git a/libs/libc/machine/arch_atomic_irq.c b/libs/libc/machine/arch_atomic_irq.c index 4a50d0aa2fb..483d7b1fed3 100644 --- a/libs/libc/machine/arch_atomic_irq.c +++ b/libs/libc/machine/arch_atomic_irq.c @@ -68,7 +68,7 @@ STORE(__atomic_store_, 2, uint16_t) ****************************************************************************/ STORE(__atomic_store_, 4, uint32_t) -STORE(nx_atomic_store_, 4, int32_t) +STORE(atomic_store_, 4, int32_t) /**************************************************************************** * Name: __atomic_load_1 @@ -87,7 +87,7 @@ LOAD(__atomic_load_, 2, uint16_t) ****************************************************************************/ LOAD(__atomic_load_, 4, uint32_t) -LOAD(nx_atomic_load_, 4, int32_t) +LOAD(atomic_load_, 4, int32_t) /**************************************************************************** * Name: __atomic_exchange_1 @@ -106,7 +106,7 @@ EXCHANGE(__atomic_exchange_, 2, uint16_t) ****************************************************************************/ EXCHANGE(__atomic_exchange_, 4, uint32_t) -EXCHANGE(nx_atomic_exchange_, 4, int32_t) +EXCHANGE(atomic_exchange_, 4, int32_t) /**************************************************************************** * Name: __atomic_compare_exchange_1 @@ -125,7 +125,7 @@ CMP_EXCHANGE(__atomic_compare_exchange_, 2, uint16_t) ****************************************************************************/ CMP_EXCHANGE(__atomic_compare_exchange_, 4, uint32_t) -CMP_EXCHANGE(nx_atomic_compare_exchange_, 4, int32_t) +CMP_EXCHANGE(atomic_compare_exchange_, 4, int32_t) /**************************************************************************** * Name: __atomic_flag_test_and_set_1 @@ -144,7 +144,7 @@ FLAG_TEST_AND_SET(__atomic_flags_test_and_set_, 2, uint16_t) ****************************************************************************/ FLAG_TEST_AND_SET(__atomic_flags_test_and_set_, 4, uint32_t) -FLAG_TEST_AND_SET(nx_atomic_flags_test_and_set_, 4, int32_t) +FLAG_TEST_AND_SET(atomic_flags_test_and_set_, 4, int32_t) /**************************************************************************** * Name: __atomic_fetch_add_1 @@ -163,7 +163,7 @@ FETCH_ADD(__atomic_fetch_add_, 2, uint16_t) ****************************************************************************/ FETCH_ADD(__atomic_fetch_add_, 4, uint32_t) -FETCH_ADD(nx_atomic_fetch_add_, 4, int32_t) +FETCH_ADD(atomic_fetch_add_, 4, int32_t) /**************************************************************************** * Name: __atomic_fetch_sub_1 @@ -182,7 +182,7 @@ FETCH_SUB(__atomic_fetch_sub_, 2, uint16_t) ****************************************************************************/ FETCH_SUB(__atomic_fetch_sub_, 4, uint32_t) -FETCH_SUB(nx_atomic_fetch_sub_, 4, int32_t) +FETCH_SUB(atomic_fetch_sub_, 4, int32_t) /**************************************************************************** * Name: __atomic_fetch_and_1 @@ -201,7 +201,7 @@ FETCH_AND(__atomic_fetch_and_, 2, uint16_t) ****************************************************************************/ FETCH_AND(__atomic_fetch_and_, 4, uint32_t) -FETCH_AND(nx_atomic_fetch_and_, 4, int32_t) +FETCH_AND(atomic_fetch_and_, 4, int32_t) /**************************************************************************** * Name: __atomic_fetch_or_1 @@ -220,7 +220,7 @@ FETCH_OR(__atomic_fetch_or_, 2, uint16_t) ****************************************************************************/ FETCH_OR(__atomic_fetch_or_, 4, uint32_t) -FETCH_OR(nx_atomic_fetch_or_, 4, int32_t) +FETCH_OR(atomic_fetch_or_, 4, int32_t) /**************************************************************************** * Name: __atomic_fetch_xor_1 @@ -239,7 +239,7 @@ FETCH_XOR(__atomic_fetch_xor_, 2, uint16_t) ****************************************************************************/ FETCH_XOR(__atomic_fetch_xor_, 4, uint32_t) -FETCH_XOR(nx_atomic_fetch_xor_, 4, int32_t) +FETCH_XOR(atomic_fetch_xor_, 4, int32_t) /* Clang define the __sync builtins, add #ifndef to avoid * redefined/redeclared problem. diff --git a/libs/libc/machine/tricore/arch_atomic.c b/libs/libc/machine/tricore/arch_atomic.c index 7f10fa0f079..970f90e6e10 100644 --- a/libs/libc/machine/tricore/arch_atomic.c +++ b/libs/libc/machine/tricore/arch_atomic.c @@ -89,7 +89,7 @@ \ do \ { \ - old_val = nx_atomic_load_4(ptr, memorder); \ + old_val = atomic_load_4(ptr, memorder); \ } \ while (__cmpAndSwap(ptr, old_val + value, old_val) != old_val); \ \ @@ -104,7 +104,7 @@ \ do \ { \ - old_val = nx_atomic_load_4(ptr, memorder); \ + old_val = atomic_load_4(ptr, memorder); \ } \ while (__cmpAndSwap(ptr, old_val - value, old_val) != old_val); \ \ @@ -119,7 +119,7 @@ \ do \ { \ - old_val = nx_atomic_load_4(ptr, memorder); \ + old_val = atomic_load_4(ptr, memorder); \ } \ while (__cmpAndSwap(ptr, old_val & value, old_val) != old_val); \ \ @@ -134,7 +134,7 @@ \ do \ { \ - old_val = nx_atomic_load_4(ptr, memorder); \ + old_val = atomic_load_4(ptr, memorder); \ } \ while (__cmpAndSwap(ptr, old_val | value, old_val) != old_val); \ \ @@ -149,7 +149,7 @@ \ do \ { \ - old_val = nx_atomic_load_4(ptr, memorder); \ + old_val = atomic_load_4(ptr, memorder); \ } \ while (__cmpAndSwap(ptr, old_val ^ value, old_val) != old_val); \ \ @@ -165,67 +165,67 @@ ****************************************************************************/ ARCH_ATOMIC_STORE_4(__atomic_store_4) -ARCH_ATOMIC_STORE_4(nx_atomic_store_4) +ARCH_ATOMIC_STORE_4(atomic_store_4) /**************************************************************************** * Name: atomic_load_4 ****************************************************************************/ ARCH_ATOMIC_LOAD_4(__atomic_load_4) -ARCH_ATOMIC_LOAD_4(nx_atomic_load_4) +ARCH_ATOMIC_LOAD_4(atomic_load_4) /**************************************************************************** * Name: atomic_exchange_4 ****************************************************************************/ ARCH_ATOMIC_EXCHANGE_4(__atomic_exchange_4) -ARCH_ATOMIC_EXCHANGE_4(nx_atomic_exchange_4) +ARCH_ATOMIC_EXCHANGE_4(atomic_exchange_4) /**************************************************************************** * Name: atomic_compare_exchange_4 ****************************************************************************/ ARCH_ATOMIC_COMPARE_EXCHANGE_4(__atomic_compare_exchange_4) -ARCH_ATOMIC_COMPARE_EXCHANGE_4(nx_atomic_compare_exchange_4) +ARCH_ATOMIC_COMPARE_EXCHANGE_4(atomic_compare_exchange_4) /**************************************************************************** * Name: atomic_flag_test_and_set_4 ****************************************************************************/ ARCH_ATOMIC_FLAGS_TEST_AND_SET_4(__atomic_flags_test_and_set_4) -ARCH_ATOMIC_FLAGS_TEST_AND_SET_4(nx_atomic_flags_test_and_set_4) +ARCH_ATOMIC_FLAGS_TEST_AND_SET_4(atomic_flags_test_and_set_4) /**************************************************************************** * Name: atomic_fetch_add_4 ****************************************************************************/ ARCH_ATOMIC_FETCH_ADD_4(__atomic_fetch_add_4) -ARCH_ATOMIC_FETCH_ADD_4(nx_atomic_fetch_add_4) +ARCH_ATOMIC_FETCH_ADD_4(atomic_fetch_add_4) /**************************************************************************** * Name: atomic_fetch_sub_4 ****************************************************************************/ ARCH_ATOMIC_FETCH_SUB_4(__atomic_fetch_sub_4) -ARCH_ATOMIC_FETCH_SUB_4(nx_atomic_fetch_sub_4) +ARCH_ATOMIC_FETCH_SUB_4(atomic_fetch_sub_4) /**************************************************************************** * Name: atomic_fetch_and_4 ****************************************************************************/ ARCH_ATOMIC_FETCH_AND_4(__atomic_fetch_and_4) -ARCH_ATOMIC_FETCH_AND_4(nx_atomic_fetch_and_4) +ARCH_ATOMIC_FETCH_AND_4(atomic_fetch_and_4) /**************************************************************************** * Name: atomic_fetch_or_4 ****************************************************************************/ ARCH_ATOMIC_FETCH_OR_4(__atomic_fetch_or_4) -ARCH_ATOMIC_FETCH_OR_4(nx_atomic_fetch_or_4) +ARCH_ATOMIC_FETCH_OR_4(atomic_fetch_or_4) /**************************************************************************** * Name: atomic_fetch_xor_4 ****************************************************************************/ ARCH_ATOMIC_FETCH_XOR_4(__atomic_fetch_xor_4) -ARCH_ATOMIC_FETCH_XOR_4(nx_atomic_fetch_xor_4) +ARCH_ATOMIC_FETCH_XOR_4(atomic_fetch_xor_4)