mirror of
https://github.com/apache/nuttx.git
synced 2026-08-24 15:08:47 +00:00
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:
parent
f02b86dc46
commit
aee6fa1462
4 changed files with 175 additions and 234 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue