diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 988524f..513e0bc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,10 @@ jobs: if: startsWith(matrix.rust, 'nightly') run: cargo check -Z features=dev_dep - run: cargo test + - name: Install cargo-hack + uses: taiki-e/install-action@cargo-hack + - run: rustup target add thumbv7m-none-eabi + - run: cargo hack build --target thumbv7m-none-eabi --no-default-features --no-dev-deps msrv: runs-on: ubuntu-latest diff --git a/Cargo.toml b/Cargo.toml index 1baac7e..7ceec1a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,5 +19,9 @@ keywords = ["waker", "notify", "wake", "futures", "async"] categories = ["asynchronous", "concurrency"] exclude = ["/.*"] +[dependencies] +# Uses portable-atomic polyfill atomics on targets without them +portable-atomic = { version = "0.3", optional = true, default-features = false } + [dev-dependencies] futures = "0.3.5" diff --git a/src/lib.rs b/src/lib.rs index 53c1e8b..7e803a7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,10 +1,26 @@ //! `futures::task::AtomicWaker` extracted into its own crate. +//! +//! # Features +//! +//! This crate adds a feature, `portable-atomic`, which uses a polyfill +//! from the [`portable-atomic`] crate in order to provide functionality +//! to targets without atomics. See the [`README`] for the [`portable-atomic`] +//! crate for more information on how to use it on single-threaded targets. +//! +//! [`portable-atomic`]: https://crates.io/crates/portable-atomic +//! [`README`]: https://github.com/taiki-e/portable-atomic/blob/main/README.md#optional-cfg -use std::cell::UnsafeCell; -use std::fmt; -use std::sync::atomic::AtomicUsize; -use std::sync::atomic::Ordering::{AcqRel, Acquire, Release}; -use std::task::Waker; +#![no_std] + +use core::cell::UnsafeCell; +use core::fmt; +use core::sync::atomic::Ordering::{AcqRel, Acquire, Release}; +use core::task::Waker; + +#[cfg(not(feature = "portable-atomic"))] +use core::sync::atomic::AtomicUsize; +#[cfg(feature = "portable-atomic")] +use portable_atomic::AtomicUsize; /// A synchronization primitive for task wakeup. ///