Skip to content

core/lib/atomic_c11: Add __atomic_test_and_set()#21883

Merged
benpicco merged 2 commits intoRIOT-OS:masterfrom
maribu:core/lib/atomics
Nov 19, 2025
Merged

core/lib/atomic_c11: Add __atomic_test_and_set()#21883
benpicco merged 2 commits intoRIOT-OS:masterfrom
maribu:core/lib/atomics

Conversation

@maribu
Copy link
Copy Markdown
Member

@maribu maribu commented Nov 16, 2025

Contribution description

This adds a previously missing library implementation for __atomic_test_and_set().

Testing procedure

In master:

undefined reference to `__atomic_test_and_set'
 make BOARD=arduino-mega2560 -C tests/bench/msg_pingpong
make: Entering directory '/home/maribu/Repos/software/RIOT/master/tests/bench/msg_pingpong'
Building application "tests_msg_pingpong" for "arduino-mega2560" with CPU "atmega2560".

"make" -C /home/maribu/Repos/software/RIOT/master/boards
"make" -C /home/maribu/Repos/software/RIOT/master/boards/common/init
"make" -C /home/maribu/Repos/software/RIOT/master/boards/arduino-mega2560
"make" -C /home/maribu/Repos/software/RIOT/master/boards/common/arduino-atmega
"make" -C /home/maribu/Repos/software/RIOT/master/boards/common/atmega
"make" -C /home/maribu/Repos/software/RIOT/master/core
"make" -C /home/maribu/Repos/software/RIOT/master/core/lib
"make" -C /home/maribu/Repos/software/RIOT/master/cpu/atmega2560
"make" -C /home/maribu/Repos/software/RIOT/master/cpu/atmega_common
"make" -C /home/maribu/Repos/software/RIOT/master/cpu/atmega_common/periph
"make" -C /home/maribu/Repos/software/RIOT/master/cpu/avr8_common
"make" -C /home/maribu/Repos/software/RIOT/master/cpu/avr8_common/avr_libc_extra
"make" -C /home/maribu/Repos/software/RIOT/master/cpu/avr8_common/periph
"make" -C /home/maribu/Repos/software/RIOT/master/drivers
"make" -C /home/maribu/Repos/software/RIOT/master/drivers/periph_common
"make" -C /home/maribu/Repos/software/RIOT/master/sys
"make" -C /home/maribu/Repos/software/RIOT/master/sys/auto_init
"make" -C /home/maribu/Repos/software/RIOT/master/sys/div
"make" -C /home/maribu/Repos/software/RIOT/master/sys/frac
"make" -C /home/maribu/Repos/software/RIOT/master/sys/isrpipe
"make" -C /home/maribu/Repos/software/RIOT/master/sys/libc
"make" -C /home/maribu/Repos/software/RIOT/master/sys/malloc_thread_safe
"make" -C /home/maribu/Repos/software/RIOT/master/sys/pm_layered
"make" -C /home/maribu/Repos/software/RIOT/master/sys/preprocessor
"make" -C /home/maribu/Repos/software/RIOT/master/sys/stdio
"make" -C /home/maribu/Repos/software/RIOT/master/sys/stdio_uart
"make" -C /home/maribu/Repos/software/RIOT/master/sys/test_utils/interactive_sync
"make" -C /home/maribu/Repos/software/RIOT/master/sys/test_utils/print_stack_usage
"make" -C /home/maribu/Repos/software/RIOT/master/sys/tiny_strerror
"make" -C /home/maribu/Repos/software/RIOT/master/sys/tsrb
"make" -C /home/maribu/Repos/software/RIOT/master/sys/ztimer
/usr/lib/gcc/avr/15.2.0/../../../../avr/bin/ld: /home/maribu/Repos/software/RIOT/master/tests/bench/msg_pingpong/bin/arduino-mega2560/application_tests_msg_pingpong/main.o: in function `main':
/home/maribu/Repos/software/RIOT/master/tests/bench/msg_pingpong/main.c:75:(.text.startup.main+0x68): undefined reference to `__atomic_test_and_set'
/usr/lib/gcc/avr/15.2.0/../../../../avr/bin/ld: /home/maribu/Repos/software/RIOT/master/tests/bench/msg_pingpong/main.c:78:(.text.startup.main+0x8e): undefined reference to `__atomic_test_and_set'
collect2: error: ld returned 1 exit status
make: *** [/home/maribu/Repos/software/RIOT/master/tests/bench/msg_pingpong/../../../Makefile.include:734: /home/maribu/Repos/software/RIOT/master/tests/bench/msg_pingpong/bin/arduino-mega2560/tests_msg_pingpong.elf] Error 1
make: Leaving directory '/home/maribu/Repos/software/RIOT/master/tests/bench/msg_pingpong'

In this PR

{ "result" : 12302, "ticks" : 1300 }
make BOARD=arduino-mega2560 -C tests/bench/msg_pingpong flash test       
make: Entering directory '/home/maribu/Repos/software/RIOT/master/tests/bench/msg_pingpong'
Building application "tests_msg_pingpong" for "arduino-mega2560" with CPU "atmega2560".

"make" -C /home/maribu/Repos/software/RIOT/master/boards
"make" -C /home/maribu/Repos/software/RIOT/master/boards/common/init
"make" -C /home/maribu/Repos/software/RIOT/master/boards/arduino-mega2560
"make" -C /home/maribu/Repos/software/RIOT/master/boards/common/arduino-atmega
"make" -C /home/maribu/Repos/software/RIOT/master/boards/common/atmega
"make" -C /home/maribu/Repos/software/RIOT/master/core
"make" -C /home/maribu/Repos/software/RIOT/master/core/lib
"make" -C /home/maribu/Repos/software/RIOT/master/cpu/atmega2560
"make" -C /home/maribu/Repos/software/RIOT/master/cpu/atmega_common
"make" -C /home/maribu/Repos/software/RIOT/master/cpu/atmega_common/periph
"make" -C /home/maribu/Repos/software/RIOT/master/cpu/avr8_common
"make" -C /home/maribu/Repos/software/RIOT/master/cpu/avr8_common/avr_libc_extra
"make" -C /home/maribu/Repos/software/RIOT/master/cpu/avr8_common/periph
"make" -C /home/maribu/Repos/software/RIOT/master/drivers
"make" -C /home/maribu/Repos/software/RIOT/master/drivers/periph_common
"make" -C /home/maribu/Repos/software/RIOT/master/sys
"make" -C /home/maribu/Repos/software/RIOT/master/sys/auto_init
"make" -C /home/maribu/Repos/software/RIOT/master/sys/div
"make" -C /home/maribu/Repos/software/RIOT/master/sys/frac
"make" -C /home/maribu/Repos/software/RIOT/master/sys/isrpipe
"make" -C /home/maribu/Repos/software/RIOT/master/sys/libc
"make" -C /home/maribu/Repos/software/RIOT/master/sys/malloc_thread_safe
"make" -C /home/maribu/Repos/software/RIOT/master/sys/pm_layered
"make" -C /home/maribu/Repos/software/RIOT/master/sys/preprocessor
"make" -C /home/maribu/Repos/software/RIOT/master/sys/stdio
"make" -C /home/maribu/Repos/software/RIOT/master/sys/stdio_uart
"make" -C /home/maribu/Repos/software/RIOT/master/sys/test_utils/interactive_sync
"make" -C /home/maribu/Repos/software/RIOT/master/sys/test_utils/print_stack_usage
"make" -C /home/maribu/Repos/software/RIOT/master/sys/tiny_strerror
"make" -C /home/maribu/Repos/software/RIOT/master/sys/tsrb
"make" -C /home/maribu/Repos/software/RIOT/master/sys/ztimer
   text	   data	    bss	    dec	    hex	filename
  12020	    208	   1719	  13947	   367b	/home/maribu/Repos/software/RIOT/master/tests/bench/msg_pingpong/bin/arduino-mega2560/tests_msg_pingpong.elf
avrdude -c stk500v2 -p m2560 -P /dev/ttyACM0 -D -U flash:w:/home/maribu/Repos/software/RIOT/master/tests/bench/msg_pingpong/bin/arduino-mega2560/tests_msg_pingpong.hex
Reading 12228 bytes for flash from input file tests_msg_pingpong.hex
Writing 12228 bytes to flash
Writing | ################################################## | 100% 1.99 s 
Reading | ################################################## | 100% 1.51 s 
12228 bytes of flash verified

Avrdude done.  Thank you.
r
/home/maribu/Repos/software/RIOT/master/dist/tools/pyterm/pyterm -p "/dev/ttyACM0" -b "9600" -ln "/tmp/pyterm-maribu" -rn "2025-11-16_20.56.20-tests_msg_pingpong-arduino-mega2560" --no-reconnect --noprefix --no-repeat-command-on-empty-line 
Twisted not available, please install it if you want to use pyterm's JSON capabilities
Connect to serial port /dev/ttyACM0


Welcome to pyterm!
Type '/exit' to exit.
Help: Press s to start test, r to print it is ready
READY
s
START
main(): This is RIOT! (Version: 2026.01-devel-128-g2dfdf-core/lib/atomics)
main starting
{ "result" : 12302, "ticks" : 1300 }

make: Leaving directory '/home/maribu/Repos/software/RIOT/master/tests/bench/msg_pingpong'

Issues/PRs references

None

This adds a previously missing library implementation for
`__atomic_test_and_set()`.
@maribu maribu requested a review from kaspar030 as a code owner November 16, 2025 19:57
@github-actions github-actions bot added the Area: core Area: RIOT kernel. Handle PRs marked with this with care! label Nov 16, 2025
@maribu
Copy link
Copy Markdown
Member Author

maribu commented Nov 16, 2025

For reference: Test output in master with BUILD_IN_DOCKER=1:

Help: Press s to start test, r to print it is ready
READY
s
START
main(): This is RIOT! (Version: 2026.01-devel-126-gdcf4a)
main starting
{ "result" : 13034, "ticks" : 1227 }

@crasbe crasbe added Type: enhancement The issue suggests enhanceable parts / The PR enhances parts of the codebase / documentation CI: ready for build If set, CI server will compile all applications for all available boards for the labeled PR labels Nov 16, 2025
Copy link
Copy Markdown
Contributor

@crasbe crasbe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't really comment about the changes themselves, sorry 😅

@riot-ci
Copy link
Copy Markdown

riot-ci commented Nov 16, 2025

Murdock results

✔️ PASSED

a32e108 core/lib/atomic_c11: Fix compatibility with GCC

Success Failures Total Runtime
10932 0 10932 12m:59s

Artifacts

Copy link
Copy Markdown
Contributor

@mguetschow mguetschow left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Straightforward addition, thanks! Just a question below.

GCC requires symbols to first be declared before they can be renamed.
So we move the `#pragma redefine_extname` just to the bottom of the
compilation unit.

Co-authored-by: crasbe <[email protected]>
Co-authored-by: Mikolai Gütschow <[email protected]>
Copy link
Copy Markdown
Contributor

@mguetschow mguetschow left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, thanks! Trusting your testing :)

@crasbe
Copy link
Copy Markdown
Contributor

crasbe commented Nov 18, 2025

Is this a 2 ACK kind of PR? 🤔

@benpicco benpicco added this pull request to the merge queue Nov 19, 2025
Merged via the queue into RIOT-OS:master with commit 250758c Nov 19, 2025
27 checks passed
@maribu maribu deleted the core/lib/atomics branch November 19, 2025 16:13
@maribu
Copy link
Copy Markdown
Member Author

maribu commented Nov 19, 2025

Thx a lot ❤️

@maribu maribu added Type: bug The issue reports a bug / The PR fixes a bug (including spelling errors) and removed Type: enhancement The issue suggests enhanceable parts / The PR enhances parts of the codebase / documentation labels Nov 23, 2025
@maribu
Copy link
Copy Markdown
Member Author

maribu commented Nov 23, 2025

@benpicco Do you want a backport? This does fix issues with more recent versions of GCC on niche platforms.

To be honest, I would have assume that 8-bit writes on AVR would have been naturally atomic. Maybe an IRQ could fire within the two CPU cycles an 8-bit write takes, practically reordering the writes?

@maribu
Copy link
Copy Markdown
Member Author

maribu commented Nov 23, 2025

Is this a 2 ACK kind of PR? 🤔

I've read the comment just now. One might argue so. We have track record of relaxing the 2 ACK policy on small bug fixes, which might apply here.

But given that @mguetschow did the ACK and @benpicco hit the merge button, at least two maintainers were involved.

@leandrolanzieri leandrolanzieri added this to the Release 2026.01 milestone Jan 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Area: core Area: RIOT kernel. Handle PRs marked with this with care! CI: ready for build If set, CI server will compile all applications for all available boards for the labeled PR Type: bug The issue reports a bug / The PR fixes a bug (including spelling errors)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants