From 8e51a9527d0ede4f7d21363abe22aef8b28aaaf5 Mon Sep 17 00:00:00 2001 From: Eric Schaal Date: Tue, 2 Sep 2025 09:56:15 -0400 Subject: [PATCH] feat: Add `extra-platforms` feature for non-atomic targets --- Cargo.lock | 7 +++++++ Cargo.toml | 5 +++++ src/atomic.rs | 4 +++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 96e4a5d..06d5ecc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -615,6 +615,7 @@ dependencies = [ "async-std", "criterion", "loom", + "portable-atomic", "tokio", ] @@ -705,6 +706,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + [[package]] name = "proc-macro2" version = "1.0.106" diff --git a/Cargo.toml b/Cargo.toml index 23d448b..1b7a17a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,11 @@ std = [] # Enables async receiving via the AsyncReceiver receiver async = [] +[dependencies] +# Use portable-atomic crate to support platforms without atomic CAS. +# Enable require-cas feature to provide an error message if dependents require atomic CAS but the end user forgets to use single-core cfg or critical-section feature. +extra-platforms = { package = "portable-atomic", version = "1.3", optional = true, default-features = false, features = ["require-cas"] } + # Only used for internal correctness testing. # Downstream users of oneshot should never enable this feature. Enabling it does nothing. # To compile oneshot built against loom one must *also* set RUSTFLAGS="--cfg oneshot_loom" diff --git a/src/atomic.rs b/src/atomic.rs index cc549e9..cd2bad6 100644 --- a/src/atomic.rs +++ b/src/atomic.rs @@ -1,4 +1,6 @@ -#[cfg(not(oneshot_loom))] +#[cfg(not(any(oneshot_loom, feature = "extra-platforms")))] pub use core::sync::atomic::{AtomicU8, Ordering, fence}; +#[cfg(feature = "extra-platforms")] +pub use extra_platforms::{AtomicU8, Ordering, fence}; #[cfg(oneshot_loom)] pub use loom::sync::atomic::{AtomicU8, Ordering, fence};