atomic: multi-backend framework + builtin + API rename - #19867
Open
zhangyu-duck wants to merge 9 commits into
Open
atomic: multi-backend framework + builtin + API rename#19867zhangyu-duck wants to merge 9 commits into
zhangyu-duck wants to merge 9 commits into
Conversation
|
zhangyu-duck
force-pushed
the
pr2-atomic-backend
branch
from
August 17, 2026 14:43
748b13e to
4084ae2
Compare
zhangyu-duck
force-pushed
the
pr2-atomic-backend
branch
4 times, most recently
from
August 18, 2026 11:40
4175fc5 to
469409e
Compare
zhangyu-duck
force-pushed
the
pr2-atomic-backend
branch
from
August 19, 2026 05:20
469409e to
11a8d03
Compare
zhangyu-duck
force-pushed
the
pr2-atomic-backend
branch
from
August 19, 2026 06:30
11a8d03 to
8f4e0a4
Compare
zhangyu-duck
marked this pull request as ready for review
August 19, 2026 06:35
zhangyu-duck
requested review from
Donny9,
GUIDINGLI,
acassis,
anchao,
davids5,
eren-terzioglu,
fdcavalcanti,
gustavonihei,
hartmannathan,
johannes-nivus,
liuguo09,
lupyuen,
masayuki2009,
pkarashchenko,
pussuw and
yamt
as code owners
August 19, 2026 06:35
🔗 Cross-repo PR dependenciesThe read-only Build run reported the following dependent PR(s) and fetched head SHA(s): CI run: https://github.com/apache/nuttx/actions/runs/32223697536 |
Contributor
|
breaking change commits and PR must me preceded by ! |
zhangyu-duck
force-pushed
the
pr2-atomic-backend
branch
from
August 19, 2026 14:44
8f4e0a4 to
eba0b06
Compare
The atomic implementation of machine/arch_atomic.c is achieved by switching interrupts. This version does not support SMP. Signed-off-by: zhangyu117 <zhangyu117@xiaomi.com>
Tricore gcc does not support atomic interface but some users need to use atomic operations, so support atomic function using tricore arch instructions (__cmpAndSwap/__swap/__ld32). Signed-off-by: zhangyu117 <zhangyu117@xiaomi.com>
Refine the atomic Kconfig to support multiple backends: LIBC_ATOMIC_TOOLCHAIN (compiler builtins), LIBC_ATOMIC_ARCH (arch instructions), and LIBC_ATOMIC_IRQ (interrupt disable). Rename arch_atomic.c to arch_atomic_irq.c since it supports the IRQ backend. Signed-off-by: zhangyu117 <zhangyu117@xiaomi.com>
Select LIBC_ATOMIC_IRQ at the architecture level (ARM7TDMI, ARM926EJS, ARMv6M) for chips that do not support atomic operations natively. This covers all ARM7TDMI, ARM926EJS, and Cortex-M0 based chips automatically. Also select LIBC_ATOMIC_IRQ for specific non-ARM architectures (AVR, RISC-V, SPARC, Xtensa) that lack atomic instruction support. Signed-off-by: zhangyu117 <zhangyu117@xiaomi.com>
Replace atomic_load with atomic_read in call sites to use the unified interface defined in <nuttx/atomic.h>. Signed-off-by: zhangyu117 <zhangyu117@xiaomi.com>
1. for tasking, map __c11_atomic_xxx as tasking_atomic_xxx 2. for msvc, map _Interlocked_xxx as msvc_atomic_xxx 3. if no special map, use gcc/clang as default as they are most widely used. Signed-off-by: zhangyu117 <zhangyu117@xiaomi.com>
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>
Rename atomic_fetch_add/sub/or/and/xor to atomic_add/sub/or/and/xor to avoid conflicts with the C/C++ standard library naming. The atomic_fetch_xxx naming is reserved by the standard; keeping it causes function name conflicts when source files indirectly include both <nuttx/atomic.h> and <atomic>/<stdatomic.h>. Signed-off-by: zhangyu117 <zhangyu117@xiaomi.com>
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 <zhangyu117@xiaomi.com>
zhangyu-duck
force-pushed
the
pr2-atomic-backend
branch
from
August 19, 2026 14:55
eba0b06 to
110b0b1
Compare
🔗 Cross-repo PR dependenciesThe read-only Build run reported the following dependent PR(s) and fetched head SHA(s): CI run: https://github.com/apache/nuttx/actions/runs/32266949770 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Rework the atomic implementation to support multiple selectable backends via Kconfig:
LIBC_ATOMIC_TOOLCHAIN- compiler builtins (default, lock-free)LIBC_ATOMIC_ARCH- arch-native atomic instructions (lock-free)LIBC_ATOMIC_HWSPINLOCK- hardware spinlock wrapping critical section (cross-core)LIBC_ATOMIC_IRQ- IRQ disable wrapping critical section (single-core fallback)Switch
<nuttx/atomic.h>to call toolchain builtin atomic functions directly (__atomic_*/__c11_atomic_*/_Interlocked*), avoiding conflicts with third-party C/C++ standard libraries.Rename
atomic_fetch_xxx->atomic_xxx(e.g.,atomic_fetch_add->atomic_add) because theatomic_fetch_xxxnaming is reserved by the C/C++ standard and conflicts with standard library declarations.Use
_Atomicqualifier foratomic_ttypedef when supported, with a__Atomic(t)wrapper for clang/C++ compatibility.Breaking change
This is a breaking API change. A companion PR in the apps tree renames call sites (
atomic_fetch_add->atomic_add, etc.).depends-on: apache/nuttx-apps/pull/3733
Stacked PR chain
Depends on #19866. This is PR 2 of 3:
Test
CI testbuild across ARM/RISC-V/SIM targets.