nuttx/atomic: use toolchain builtin atomic function

The reason for using builtin atomic is that in C++, when include <atomic> in <nuttx/atomic.h> easily conflicts with third-party function libraries. We wanted to completely separate the implementation of <nuttx/atomic.h>.

There are two points:
1. use builtin function directly.
2. Without the standard library implementation, need implement "atomic_fetch_xxx", leading conflicts with the standard library used by third-party programs, introducing redefinition issues and requiring name changes.

Signed-off-by: zhangyu117 <zhangyu117@xiaomi.com>
This commit is contained in:
zhangyu117 2026-08-19 12:13:03 +08:00 committed by Xiang Xiao
parent f02b86dc46
commit aee6fa1462
4 changed files with 175 additions and 234 deletions

View file

@ -29,53 +29,9 @@
#include <stdbool.h>
#define NEED_ATOMIC_MACROS
#if defined(__has_include)
# if __has_include(<atomic>) && defined(__cplusplus)
# undef NEED_ATOMIC_MACROS
# endif
#endif
#if defined(CONFIG_LIBC_ATOMIC_TOOLCHAIN)
# if __has_include(<atomic>) && defined(__cplusplus)
extern "C++"
{
# include <atomic>
# 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 <stdatomic.h>
# 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)

View file

@ -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

View file

@ -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.

View file

@ -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)