git: cb88e7b8cdd6 - main - libc: Reorder atomic operations to match ISO C standard
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 20 Jun 2026 00:24:54 UTC
The branch main has been updated by imp:
URL: https://cgit.FreeBSD.org/src/commit/?id=cb88e7b8cdd6b4c707e47abee4ba8541d9fccea6
commit cb88e7b8cdd6b4c707e47abee4ba8541d9fccea6
Author: Faraz Vahedi <kfv@kfv.io>
AuthorDate: 2026-05-02 03:40:27 +0000
Commit: Warner Losh <imp@FreeBSD.org>
CommitDate: 2026-06-20 00:23:29 +0000
libc: Reorder atomic operations to match ISO C standard
Reorder definitions of specified generic operations on atomic types
so they follow the sequence in ISO/IEC 9899:2024 ยง7.17.7:
1. `atomic_store`
2. `atomic_load`
3. `atomic_exchange`
4. `atomic_compare_exchange`
5. `atomic_fetch`
This aligns the header layout with the standard, making it easier
to cross-check against the normative text and maintain consistency
with the rest of the header.
The behaviour of the macros remains unchanged; this is purely a
reorganisation and documentation improvement.
Signed-off-by: Faraz Vahedi <kfv@kfv.io>
Reviewed by: imp
Pull Request: https://github.com/freebsd/freebsd-src/pull/2185
---
sys/sys/stdatomic.h | 100 ++++++++++++++++++++++++++--------------------------
1 file changed, 50 insertions(+), 50 deletions(-)
diff --git a/sys/sys/stdatomic.h b/sys/sys/stdatomic.h
index 135001a1f82e..bbdd196515e0 100644
--- a/sys/sys/stdatomic.h
+++ b/sys/sys/stdatomic.h
@@ -242,6 +242,12 @@ typedef _Atomic(__uintmax_t) atomic_uintmax_t;
*/
#if defined(__CLANG_ATOMICS)
+#define atomic_store_explicit(object, desired, order) \
+ __c11_atomic_store(object, desired, order)
+#define atomic_load_explicit(object, order) \
+ __c11_atomic_load(object, order)
+#define atomic_exchange_explicit(object, desired, order) \
+ __c11_atomic_exchange(object, desired, order)
#define atomic_compare_exchange_strong_explicit(object, expected, \
desired, success, failure) \
__c11_atomic_compare_exchange_strong(object, expected, desired, \
@@ -250,23 +256,23 @@ typedef _Atomic(__uintmax_t) atomic_uintmax_t;
desired, success, failure) \
__c11_atomic_compare_exchange_weak(object, expected, desired, \
success, failure)
-#define atomic_exchange_explicit(object, desired, order) \
- __c11_atomic_exchange(object, desired, order)
#define atomic_fetch_add_explicit(object, operand, order) \
__c11_atomic_fetch_add(object, operand, order)
-#define atomic_fetch_and_explicit(object, operand, order) \
- __c11_atomic_fetch_and(object, operand, order)
-#define atomic_fetch_or_explicit(object, operand, order) \
- __c11_atomic_fetch_or(object, operand, order)
#define atomic_fetch_sub_explicit(object, operand, order) \
__c11_atomic_fetch_sub(object, operand, order)
+#define atomic_fetch_or_explicit(object, operand, order) \
+ __c11_atomic_fetch_or(object, operand, order)
#define atomic_fetch_xor_explicit(object, operand, order) \
__c11_atomic_fetch_xor(object, operand, order)
-#define atomic_load_explicit(object, order) \
- __c11_atomic_load(object, order)
-#define atomic_store_explicit(object, desired, order) \
- __c11_atomic_store(object, desired, order)
+#define atomic_fetch_and_explicit(object, operand, order) \
+ __c11_atomic_fetch_and(object, operand, order)
#elif defined(__GNUC_ATOMICS)
+#define atomic_store_explicit(object, desired, order) \
+ __atomic_store_n(object, desired, order)
+#define atomic_load_explicit(object, order) \
+ __atomic_load_n(object, order)
+#define atomic_exchange_explicit(object, desired, order) \
+ __atomic_exchange_n(object, desired, order)
#define atomic_compare_exchange_strong_explicit(object, expected, \
desired, success, failure) \
__atomic_compare_exchange_n(object, expected, \
@@ -275,37 +281,23 @@ typedef _Atomic(__uintmax_t) atomic_uintmax_t;
desired, success, failure) \
__atomic_compare_exchange_n(object, expected, \
desired, 1, success, failure)
-#define atomic_exchange_explicit(object, desired, order) \
- __atomic_exchange_n(object, desired, order)
#define atomic_fetch_add_explicit(object, operand, order) \
__atomic_fetch_add(object, operand, order)
-#define atomic_fetch_and_explicit(object, operand, order) \
- __atomic_fetch_and(object, operand, order)
-#define atomic_fetch_or_explicit(object, operand, order) \
- __atomic_fetch_or(object, operand, order)
#define atomic_fetch_sub_explicit(object, operand, order) \
__atomic_fetch_sub(object, operand, order)
+#define atomic_fetch_or_explicit(object, operand, order) \
+ __atomic_fetch_or(object, operand, order)
#define atomic_fetch_xor_explicit(object, operand, order) \
__atomic_fetch_xor(object, operand, order)
-#define atomic_load_explicit(object, order) \
- __atomic_load_n(object, order)
-#define atomic_store_explicit(object, desired, order) \
- __atomic_store_n(object, desired, order)
+#define atomic_fetch_and_explicit(object, operand, order) \
+ __atomic_fetch_and(object, operand, order)
#else
#define __atomic_apply_stride(object, operand) \
(((__typeof__((object)->__val))0) + (operand))
-#define atomic_compare_exchange_strong_explicit(object, expected, \
- desired, success, failure) __extension__ ({ \
- __typeof__(expected) __ep = (expected); \
- __typeof__(*__ep) __e = *__ep; \
- (void)(success); (void)(failure); \
- (_Bool)((*__ep = __sync_val_compare_and_swap(&(object)->__val, \
- __e, desired)) == __e); \
-})
-#define atomic_compare_exchange_weak_explicit(object, expected, \
- desired, success, failure) \
- atomic_compare_exchange_strong_explicit(object, expected, \
- desired, success, failure)
+#define atomic_store_explicit(object, desired, order) \
+ ((void)atomic_exchange_explicit(object, desired, order))
+#define atomic_load_explicit(object, order) \
+ ((void)(order), __sync_fetch_and_add(&(object)->__val, 0))
#if __has_builtin(__sync_swap)
/* Clang provides a full-barrier atomic exchange - use it if available. */
#define atomic_exchange_explicit(object, desired, order) \
@@ -324,23 +316,31 @@ __extension__ ({ \
__sync_synchronize(); \
__sync_lock_test_and_set(&(__o)->__val, __d); \
})
+#define atomic_compare_exchange_strong_explicit(object, expected, \
+ desired, success, failure) __extension__ ({ \
+ __typeof__(expected) __ep = (expected); \
+ __typeof__(*__ep) __e = *__ep; \
+ (void)(success); (void)(failure); \
+ (_Bool)((*__ep = __sync_val_compare_and_swap(&(object)->__val, \
+ __e, desired)) == __e); \
+})
+#define atomic_compare_exchange_weak_explicit(object, expected, \
+ desired, success, failure) \
+ atomic_compare_exchange_strong_explicit(object, expected, \
+ desired, success, failure)
#endif
#define atomic_fetch_add_explicit(object, operand, order) \
((void)(order), __sync_fetch_and_add(&(object)->__val, \
__atomic_apply_stride(object, operand)))
-#define atomic_fetch_and_explicit(object, operand, order) \
- ((void)(order), __sync_fetch_and_and(&(object)->__val, operand))
-#define atomic_fetch_or_explicit(object, operand, order) \
- ((void)(order), __sync_fetch_and_or(&(object)->__val, operand))
#define atomic_fetch_sub_explicit(object, operand, order) \
((void)(order), __sync_fetch_and_sub(&(object)->__val, \
__atomic_apply_stride(object, operand)))
+#define atomic_fetch_or_explicit(object, operand, order) \
+ ((void)(order), __sync_fetch_and_or(&(object)->__val, operand))
#define atomic_fetch_xor_explicit(object, operand, order) \
((void)(order), __sync_fetch_and_xor(&(object)->__val, operand))
-#define atomic_load_explicit(object, order) \
- ((void)(order), __sync_fetch_and_add(&(object)->__val, 0))
-#define atomic_store_explicit(object, desired, order) \
- ((void)atomic_exchange_explicit(object, desired, order))
+#define atomic_fetch_and_explicit(object, operand, order) \
+ ((void)(order), __sync_fetch_and_and(&(object)->__val, operand))
#endif
/*
@@ -351,28 +351,28 @@ __extension__ ({ \
*/
#ifndef _KERNEL
+#define atomic_store(object, desired) \
+ atomic_store_explicit(object, desired, memory_order_seq_cst)
+#define atomic_load(object) \
+ atomic_load_explicit(object, memory_order_seq_cst)
+#define atomic_exchange(object, desired) \
+ atomic_exchange_explicit(object, desired, memory_order_seq_cst)
#define atomic_compare_exchange_strong(object, expected, desired) \
atomic_compare_exchange_strong_explicit(object, expected, \
desired, memory_order_seq_cst, memory_order_seq_cst)
#define atomic_compare_exchange_weak(object, expected, desired) \
atomic_compare_exchange_weak_explicit(object, expected, \
desired, memory_order_seq_cst, memory_order_seq_cst)
-#define atomic_exchange(object, desired) \
- atomic_exchange_explicit(object, desired, memory_order_seq_cst)
#define atomic_fetch_add(object, operand) \
atomic_fetch_add_explicit(object, operand, memory_order_seq_cst)
-#define atomic_fetch_and(object, operand) \
- atomic_fetch_and_explicit(object, operand, memory_order_seq_cst)
-#define atomic_fetch_or(object, operand) \
- atomic_fetch_or_explicit(object, operand, memory_order_seq_cst)
#define atomic_fetch_sub(object, operand) \
atomic_fetch_sub_explicit(object, operand, memory_order_seq_cst)
+#define atomic_fetch_or(object, operand) \
+ atomic_fetch_or_explicit(object, operand, memory_order_seq_cst)
#define atomic_fetch_xor(object, operand) \
atomic_fetch_xor_explicit(object, operand, memory_order_seq_cst)
-#define atomic_load(object) \
- atomic_load_explicit(object, memory_order_seq_cst)
-#define atomic_store(object, desired) \
- atomic_store_explicit(object, desired, memory_order_seq_cst)
+#define atomic_fetch_and(object, operand) \
+ atomic_fetch_and_explicit(object, operand, memory_order_seq_cst)
#endif /* !_KERNEL */
/*