From nobody Sat Jun 20 00:24:54 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4ghwFz4FDJz6hFLT for ; Sat, 20 Jun 2026 00:24:55 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ghwFz1rf4z3J2C for ; Sat, 20 Jun 2026 00:24:55 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1781915095; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=riuQ6EveyMjs1SNqEsxT76btP8g6fU+TniIV0WUIDic=; b=kM8SBl5vCpnZ7ymJwtCSR8AyfELFC/PqGw+++9EESJcnf46Kw8B8QgOMfUeWy+oXeSMJPE TfamCxSfg2SGT0/a1wFTnOMIctA7cbawwELLNsQOBtFCyMfi3OkloXPJ5B+aX9efChlEsr M/BTnwD2ENolJCs4Tgp6+4FNwdi64ML3ub/MSbRG/wHUpcDmbWe28hm4Ab9UjOvAhUaPLV rDnqJgzAEiMW5faXwK6/O58whx14Z88jyWL7srzZJhOMmp01hjX9175lw6YT/hCffvD9mw 98FN5UJw+dWaAYVaTHMJABhiBBWjtgJPhS2X8NhlaNIKSDcA3lpGhGOm7pRJHg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1781915095; a=rsa-sha256; cv=none; b=hDLN013m2CSV+s/otSzln4pjFv6AsAPLBz8/Ng07TmhrNiYHKmHTW3j5z416SCmOcg9IYx 96frSSFscOVpRKERruysSl1J2VgG6ExZiYq+dHLxBl40NEE0N+XzwJYZ1wMrvVgcFV/oQH DSpygYqfg/eyC2WhSoNbQbWpsZIDBS4bSTW4tmV6iX3FD5zGaHGMG2ER3MqWMG/zz4eef4 X5tQv+yD0MSZ+GleKhNpJgPCxFJ4Pyocraz2wohZt1IpLgNa/r3FVsj3IH0RxfAzPy9WFY 0K8opi6CWs7trwKdUqFwcQdDE9ZD31LMZ56tLFBnsoTlJBunsm2GQPxgkfbd7g== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1781915095; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=riuQ6EveyMjs1SNqEsxT76btP8g6fU+TniIV0WUIDic=; b=sWMfptNKo7078gD8zjch3XhABTncbJyd0eUCDRsEdW3IVtPvolUfi7NF6LRv8TSVl/V2wM m+eaTm1tVfZZoljL0CDaq0INQI6f8nYWBKbaNMr1pG/jqgRfxVmyyPvRRDlE2KZkUikhFh D74TQT4Xc18DE6V3BCGxfWKGMgh53/ZWoL5K1JFRXNvWWZA7Q61u+qAsmwDnXuBzuV8K9K pjO0Dw11uCvf4kp0+FroJ1dth5mz+55aULBZwki5+pA0llb9EpqdkfUGrVC4YIgRciD3Hc dwjLX7pm+IwldYFbE7fFhHjRtIFYGPmA/hq3SctZ3UvqyA8NaP10OuZM43znpA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4ghwFy6BmJz17CN for ; Sat, 20 Jun 2026 00:24:54 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 24ba6 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 20 Jun 2026 00:24:54 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Faraz Vahedi From: Warner Losh Subject: git: cb88e7b8cdd6 - main - libc: Reorder atomic operations to match ISO C standard List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: cb88e7b8cdd6b4c707e47abee4ba8541d9fccea6 Auto-Submitted: auto-generated Date: Sat, 20 Jun 2026 00:24:54 +0000 Message-Id: <6a35ddd6.24ba6.3aa94789@gitrepo.freebsd.org> The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=cb88e7b8cdd6b4c707e47abee4ba8541d9fccea6 commit cb88e7b8cdd6b4c707e47abee4ba8541d9fccea6 Author: Faraz Vahedi AuthorDate: 2026-05-02 03:40:27 +0000 Commit: Warner Losh 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 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 */ /*