From 95fe3e8680b6570170eaed9bbd9e75a8b6574c2c Mon Sep 17 00:00:00 2001 From: zhangyu117 Date: Wed, 12 Aug 2026 15:28:17 +0800 Subject: [PATCH] nuttx/atomic.h: use _Atomic define atomic_t. 1. use _atomic as wrapper because if _Atomic empty, may affects the compilation of other files: 2. for clang builtin function, it donot accept param with keyword "_Atomic" Signed-off-by: zhangyu117 --- include/nuttx/atomic.h | 5 ++-- include/nuttx/compiler.h | 65 ++++++++++++++++++---------------------- tools/nxstyle.c | 4 +++ 3 files changed, 35 insertions(+), 39 deletions(-) diff --git a/include/nuttx/atomic.h b/include/nuttx/atomic.h index 9f466ff7dd4..aa381a4402e 100644 --- a/include/nuttx/atomic.h +++ b/include/nuttx/atomic.h @@ -159,9 +159,8 @@ * Public Types ****************************************************************************/ -typedef volatile int32_t atomic_t; -typedef volatile int64_t atomic64_t; - +typedef __Atomic(int32_t) atomic_t; +typedef __Atomic(int64_t) atomic64_t; /**************************************************************************** * Public Function Prototypes diff --git a/include/nuttx/compiler.h b/include/nuttx/compiler.h index 32a2a96d765..00f926a3510 100644 --- a/include/nuttx/compiler.h +++ b/include/nuttx/compiler.h @@ -79,6 +79,15 @@ # define CONFIG_HAVE_CXX14 1 #endif +/* Keyword about _Atomic */ + +#if defined(__cplusplus) || defined(__clang__) || \ + !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L +# define __Atomic(t) t +#else +# define __Atomic(t) _Atomic(t) +#endif + /* Green Hills Software definitions *****************************************/ #if defined(__ghs__) @@ -1383,44 +1392,28 @@ /* Atomic functions. */ # ifdef CONFIG_LIBC_ATOMIC_TOOLCHAIN -# define atomic_store_4(obj, val, memorder) \ - __c11_atomic_store((FAR volatile _Atomic int32_t*)obj, val, memorder) -# define atomic_store_8(obj, val, memorder) \ - __c11_atomic_store((FAR volatile _Atomic int64_t*)obj, val, memorder) -# define atomic_load_4(obj, memorder) \ - __c11_atomic_load((FAR volatile _Atomic int32_t*)obj, memorder) -# define atomic_load_8(obj, memorder) \ - __c11_atomic_load((FAR volatile _Atomic int64_t*)obj, memorder) -# define atomic_fetch_add_4(obj, val, memorder) \ - __c11_atomic_fetch_add((FAR volatile _Atomic int32_t*)obj, val, memorder) -# define atomic_fetch_add_8(obj, val, memorder) \ - __c11_atomic_fetch_add((FAR volatile _Atomic int64_t*)obj, val, memorder) -# define atomic_fetch_sub_4(obj, val, memorder) \ - __c11_atomic_fetch_sub((FAR volatile _Atomic int32_t*)obj, val, memorder) -# define atomic_fetch_sub_8(obj, val, memorder) \ - __c11_atomic_fetch_sub((FAR volatile _Atomic int64_t*)obj, val, memorder) -# define atomic_fetch_and_4(obj, val, memorder) \ - __c11_atomic_fetch_and((FAR volatile _Atomic int32_t*)obj, val, memorder) -# define atomic_fetch_and_8(obj, val, memorder) \ - __c11_atomic_fetch_and((FAR volatile _Atomic int64_t*)obj, val, memorder) -# define atomic_fetch_or_4(obj, val, memorder) \ - __c11_atomic_fetch_or((FAR volatile _Atomic int32_t*)obj, val, memorder) -# define atomic_fetch_or_8(obj, val, memorder) \ - __c11_atomic_fetch_or((FAR volatile _Atomic int64_t*)obj, val, memorder) -# define atomic_fetch_xor_4(obj, val, memorder) \ - __c11_atomic_fetch_xor((FAR volatile _Atomic int32_t*)obj, val, memorder) -# define atomic_fetch_xor_8(obj, val, memorder) \ - __c11_atomic_fetch_xor((FAR volatile _Atomic int64_t*)obj, val, memorder) -# define atomic_exchange_4(obj, val, memorder) \ - __c11_atomic_exchange((FAR volatile _Atomic int32_t*)obj, val, memorder) -# define atomic_exchange_8(obj, val, memorder) \ - __c11_atomic_exchange((FAR volatile _Atomic int64_t*)obj, val, memorder) +# define atomic_store_4(obj, val, memorder) __c11_atomic_store(obj, val, memorder) +# define atomic_store_8(obj, val, memorder) __c11_atomic_store(obj, val, memorder) +# define atomic_load_4(obj, memorder) __c11_atomic_load(obj, memorder) +# define atomic_load_8(obj, memorder) __c11_atomic_load(obj, memorder) +# define atomic_fetch_add_4(obj, val, memorder) __c11_atomic_add(obj, val, memorder) +# define atomic_fetch_add_8(obj, val, memorder) __c11_atomic_add(obj, val, memorder) +# define atomic_fetch_sub_4(obj, val, memorder) __c11_atomic_sub(obj, val, memorder) +# define atomic_fetch_sub_8(obj, val, memorder) __c11_atomic_sub(obj, val, memorder) +# define atomic_fetch_and_4(obj, val, memorder) __c11_atomic_and(obj, val, memorder) +# define atomic_fetch_and_8(obj, val, memorder) __c11_atomic_and(obj, val, memorder) +# define atomic_fetch_or_4(obj, val, memorder) __c11_atomic_or(obj, val, memorder) +# define atomic_fetch_or_8(obj, val, memorder) __c11_atomic_or(obj, val, memorder) +# define atomic_fetch_xor_4(obj, val, memorder) __c11_atomic_xor(obj, val, memorder) +# define atomic_fetch_xor_8(obj, val, memorder) __c11_atomic_xor(obj, val, memorder) +# define atomic_exchange_4(obj, val, memorder) __c11_atomic_exchange(obj, val, memorder) +# define atomic_exchange_8(obj, val, memorder) __c11_atomic_exchange(obj, val, memorder) # define atomic_compare_exchange_4(obj, expected, desired, weak, success, failure) \ - ((weak) ? __c11_atomic_compare_exchange_weak((FAR volatile _Atomic int32_t*)obj, expected, desired, success, failure) \ - : __c11_atomic_compare_exchange_strong((FAR volatile _Atomic int32_t*)obj, expected, desired, success, failure)) + ((weak) ? __c11_atomic_compare_exchange_weak(obj, expected, desired, success, failure) \ + : __c11_atomic_compare_exchange_strong(obj, expected, desired, success, failure)) # define atomic_compare_exchange_8(obj, expected, desired, weak, success, failure) \ - ((weak) ? __c11_atomic_compare_exchange_weak((FAR volatile _Atomic int64_t*)obj, expected, desired, success, failure) \ - : __c11_atomic_compare_exchange_strong((FAR volatile _Atomic int64_t*)obj, expected, desired, success, failure)) + ((weak) ? __c11_atomic_compare_exchange_weak(obj, expected, desired, success, failure) \ + : __c11_atomic_compare_exchange_strong(obj, expected, desired, success, failure)) # endif /* Unknown compiler *********************************************************/ diff --git a/tools/nxstyle.c b/tools/nxstyle.c index 6fa5c81688c..8a35991ba51 100644 --- a/tools/nxstyle.c +++ b/tools/nxstyle.c @@ -365,6 +365,10 @@ static const char *g_white_content_list[] = "_Atomic", + /* Ref: include/nuttx/atomic.h */ + + "__Atomic", + /* Ref: https://en.cppreference.com/w/c/keyword/_Thread_local */ "_Thread_local",