diff options
| author | Dániel Buga <[email protected]> | 2025-08-31 10:20:03 +0200 |
|---|---|---|
| committer | Dániel Buga <[email protected]> | 2025-08-31 10:22:45 +0200 |
| commit | 3fb6a9191c3d132bca5984a1ad79ad211e533912 (patch) | |
| tree | 317e95a88848f41a2484715234518984ef430c1a /embassy-executor | |
| parent | f86cf87f2f20f723e2ba2fe7d83908a2b3bac2d1 (diff) | |
Prefer pointer-sized atomic operations
Diffstat (limited to 'embassy-executor')
| -rw-r--r-- | embassy-executor/CHANGELOG.md | 1 | ||||
| -rw-r--r-- | embassy-executor/src/raw/mod.rs | 10 | ||||
| -rw-r--r-- | embassy-executor/src/raw/state_atomics.rs | 21 |
3 files changed, 25 insertions, 7 deletions
diff --git a/embassy-executor/CHANGELOG.md b/embassy-executor/CHANGELOG.md index f2db46ef9..477ea972c 100644 --- a/embassy-executor/CHANGELOG.md +++ b/embassy-executor/CHANGELOG.md | |||
| @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | |||
| 9 | ## Unreleased - ReleaseDate | 9 | ## Unreleased - ReleaseDate |
| 10 | 10 | ||
| 11 | - Added new metadata API for tasks | 11 | - Added new metadata API for tasks |
| 12 | - Fixed performance regression on some ESP32 MCUs. | ||
| 12 | 13 | ||
| 13 | ## 0.9.0 - 2025-08-26 | 14 | ## 0.9.0 - 2025-08-26 |
| 14 | 15 | ||
diff --git a/embassy-executor/src/raw/mod.rs b/embassy-executor/src/raw/mod.rs index bdaa32951..4280c5750 100644 --- a/embassy-executor/src/raw/mod.rs +++ b/embassy-executor/src/raw/mod.rs | |||
| @@ -12,8 +12,14 @@ | |||
| 12 | mod run_queue; | 12 | mod run_queue; |
| 13 | 13 | ||
| 14 | #[cfg_attr(all(cortex_m, target_has_atomic = "32"), path = "state_atomics_arm.rs")] | 14 | #[cfg_attr(all(cortex_m, target_has_atomic = "32"), path = "state_atomics_arm.rs")] |
| 15 | #[cfg_attr(all(not(cortex_m), target_has_atomic = "8"), path = "state_atomics.rs")] | 15 | #[cfg_attr( |
| 16 | #[cfg_attr(not(target_has_atomic = "8"), path = "state_critical_section.rs")] | 16 | all(not(cortex_m), any(target_has_atomic = "8", target_has_atomic = "32")), |
| 17 | path = "state_atomics.rs" | ||
| 18 | )] | ||
| 19 | #[cfg_attr( | ||
| 20 | not(any(target_has_atomic = "8", target_has_atomic = "32")), | ||
| 21 | path = "state_critical_section.rs" | ||
| 22 | )] | ||
| 17 | mod state; | 23 | mod state; |
| 18 | 24 | ||
| 19 | #[cfg(feature = "_any_trace")] | 25 | #[cfg(feature = "_any_trace")] |
diff --git a/embassy-executor/src/raw/state_atomics.rs b/embassy-executor/src/raw/state_atomics.rs index e813548ae..6675875be 100644 --- a/embassy-executor/src/raw/state_atomics.rs +++ b/embassy-executor/src/raw/state_atomics.rs | |||
| @@ -1,4 +1,15 @@ | |||
| 1 | use core::sync::atomic::{AtomicU8, Ordering}; | 1 | // Prefer pointer-width atomic operations, as narrower ones may be slower. |
| 2 | #[cfg(all(target_pointer_width = "32", target_has_atomic = "32"))] | ||
| 3 | type AtomicState = core::sync::atomic::AtomicU32; | ||
| 4 | #[cfg(not(all(target_pointer_width = "32", target_has_atomic = "32")))] | ||
| 5 | type AtomicState = core::sync::atomic::AtomicU8; | ||
| 6 | |||
| 7 | #[cfg(all(target_pointer_width = "32", target_has_atomic = "32"))] | ||
| 8 | type StateBits = u32; | ||
| 9 | #[cfg(not(all(target_pointer_width = "32", target_has_atomic = "32")))] | ||
| 10 | type StateBits = u8; | ||
| 11 | |||
| 12 | use core::sync::atomic::Ordering; | ||
| 2 | 13 | ||
| 3 | #[derive(Clone, Copy)] | 14 | #[derive(Clone, Copy)] |
| 4 | pub(crate) struct Token(()); | 15 | pub(crate) struct Token(()); |
| @@ -11,18 +22,18 @@ pub(crate) fn locked<R>(f: impl FnOnce(Token) -> R) -> R { | |||
| 11 | } | 22 | } |
| 12 | 23 | ||
| 13 | /// Task is spawned (has a future) | 24 | /// Task is spawned (has a future) |
| 14 | pub(crate) const STATE_SPAWNED: u8 = 1 << 0; | 25 | pub(crate) const STATE_SPAWNED: StateBits = 1 << 0; |
| 15 | /// Task is in the executor run queue | 26 | /// Task is in the executor run queue |
| 16 | pub(crate) const STATE_RUN_QUEUED: u8 = 1 << 1; | 27 | pub(crate) const STATE_RUN_QUEUED: StateBits = 1 << 1; |
| 17 | 28 | ||
| 18 | pub(crate) struct State { | 29 | pub(crate) struct State { |
| 19 | state: AtomicU8, | 30 | state: AtomicState, |
| 20 | } | 31 | } |
| 21 | 32 | ||
| 22 | impl State { | 33 | impl State { |
| 23 | pub const fn new() -> State { | 34 | pub const fn new() -> State { |
| 24 | Self { | 35 | Self { |
| 25 | state: AtomicU8::new(0), | 36 | state: AtomicState::new(0), |
| 26 | } | 37 | } |
| 27 | } | 38 | } |
| 28 | 39 | ||
