diff options
| author | Dániel Buga <[email protected]> | 2024-11-26 00:20:34 +0100 |
|---|---|---|
| committer | Dániel Buga <[email protected]> | 2024-12-17 16:52:13 +0100 |
| commit | c6ca46c82529e014aaceb218ad88978c50f0db07 (patch) | |
| tree | ed976c45f41a34e6b7ba59aaa047dfc6adc00728 /embassy-executor/src/raw | |
| parent | 2853308d8f7b845a9255bd7f68911a5214f17ca1 (diff) | |
Set RUN_QUEUED unconditionally
Diffstat (limited to 'embassy-executor/src/raw')
| -rw-r--r-- | embassy-executor/src/raw/mod.rs | 3 | ||||
| -rw-r--r-- | embassy-executor/src/raw/state_atomics.rs | 15 | ||||
| -rw-r--r-- | embassy-executor/src/raw/state_atomics_arm.rs | 2 | ||||
| -rw-r--r-- | embassy-executor/src/raw/state_critical_section.rs | 9 |
4 files changed, 8 insertions, 21 deletions
diff --git a/embassy-executor/src/raw/mod.rs b/embassy-executor/src/raw/mod.rs index 0ac569946..6503b556f 100644 --- a/embassy-executor/src/raw/mod.rs +++ b/embassy-executor/src/raw/mod.rs | |||
| @@ -52,7 +52,7 @@ use super::SpawnToken; | |||
| 52 | /// ```text | 52 | /// ```text |
| 53 | /// ┌────────────┐ ┌────────────────────────┐ | 53 | /// ┌────────────┐ ┌────────────────────────┐ |
| 54 | /// ┌─►│Not spawned │◄─6┤Not spawned|Run enqueued│ | 54 | /// ┌─►│Not spawned │◄─6┤Not spawned|Run enqueued│ |
| 55 | /// │ │ �� │ │ | 55 | /// │ │ ��7��►�� │ |
| 56 | /// │ └─────┬──────┘ └──────▲─────────────────┘ | 56 | /// │ └─────┬──────┘ └──────▲─────────────────┘ |
| 57 | /// │ 1 │ | 57 | /// │ 1 │ |
| 58 | /// │ │ ┌────────────┘ | 58 | /// │ │ ┌────────────┘ |
| @@ -76,6 +76,7 @@ use super::SpawnToken; | |||
| 76 | /// - 4: Task exits - `TaskStorage::poll -> Poll::Ready` | 76 | /// - 4: Task exits - `TaskStorage::poll -> Poll::Ready` |
| 77 | /// - 5: A run-queued task exits - `TaskStorage::poll -> Poll::Ready` | 77 | /// - 5: A run-queued task exits - `TaskStorage::poll -> Poll::Ready` |
| 78 | /// - 6: Task is dequeued and then ignored via `State::run_dequeue` | 78 | /// - 6: Task is dequeued and then ignored via `State::run_dequeue` |
| 79 | /// - 7: A task is waken when it is not spawned - `wake_task -> State::run_enqueue` | ||
| 79 | pub(crate) struct TaskHeader { | 80 | pub(crate) struct TaskHeader { |
| 80 | pub(crate) state: State, | 81 | pub(crate) state: State, |
| 81 | pub(crate) run_queue_item: RunQueueItem, | 82 | pub(crate) run_queue_item: RunQueueItem, |
diff --git a/embassy-executor/src/raw/state_atomics.rs b/embassy-executor/src/raw/state_atomics.rs index 6f5266bda..bdd317b53 100644 --- a/embassy-executor/src/raw/state_atomics.rs +++ b/embassy-executor/src/raw/state_atomics.rs | |||
| @@ -44,19 +44,8 @@ impl State { | |||
| 44 | /// function if the task was successfully marked. | 44 | /// function if the task was successfully marked. |
| 45 | #[inline(always)] | 45 | #[inline(always)] |
| 46 | pub fn run_enqueue(&self, f: impl FnOnce(Token)) { | 46 | pub fn run_enqueue(&self, f: impl FnOnce(Token)) { |
| 47 | if self | 47 | let prev = self.state.fetch_or(STATE_RUN_QUEUED, Ordering::AcqRel); |
| 48 | .state | 48 | if prev & STATE_RUN_QUEUED == 0 { |
| 49 | .fetch_update(Ordering::SeqCst, Ordering::SeqCst, |state| { | ||
| 50 | // If already scheduled, or if not started, | ||
| 51 | if (state & STATE_RUN_QUEUED != 0) || (state & STATE_SPAWNED == 0) { | ||
| 52 | None | ||
| 53 | } else { | ||
| 54 | // Mark it as scheduled | ||
| 55 | Some(state | STATE_RUN_QUEUED) | ||
| 56 | } | ||
| 57 | }) | ||
| 58 | .is_ok() | ||
| 59 | { | ||
| 60 | locked(f); | 49 | locked(f); |
| 61 | } | 50 | } |
| 62 | } | 51 | } |
diff --git a/embassy-executor/src/raw/state_atomics_arm.rs b/embassy-executor/src/raw/state_atomics_arm.rs index 4896b33c5..06bf24343 100644 --- a/embassy-executor/src/raw/state_atomics_arm.rs +++ b/embassy-executor/src/raw/state_atomics_arm.rs | |||
| @@ -72,7 +72,7 @@ impl State { | |||
| 72 | let state: u32; | 72 | let state: u32; |
| 73 | asm!("ldrex {}, [{}]", out(reg) state, in(reg) self, options(nostack)); | 73 | asm!("ldrex {}, [{}]", out(reg) state, in(reg) self, options(nostack)); |
| 74 | 74 | ||
| 75 | if (state & STATE_RUN_QUEUED != 0) || (state & STATE_SPAWNED == 0) { | 75 | if state & STATE_RUN_QUEUED != 0 { |
| 76 | asm!("clrex", options(nomem, nostack)); | 76 | asm!("clrex", options(nomem, nostack)); |
| 77 | return; | 77 | return; |
| 78 | } | 78 | } |
diff --git a/embassy-executor/src/raw/state_critical_section.rs b/embassy-executor/src/raw/state_critical_section.rs index 29b10f6e3..4733af278 100644 --- a/embassy-executor/src/raw/state_critical_section.rs +++ b/embassy-executor/src/raw/state_critical_section.rs | |||
| @@ -56,12 +56,9 @@ impl State { | |||
| 56 | pub fn run_enqueue(&self, f: impl FnOnce(Token)) { | 56 | pub fn run_enqueue(&self, f: impl FnOnce(Token)) { |
| 57 | critical_section::with(|cs| { | 57 | critical_section::with(|cs| { |
| 58 | if self.update_with_cs(cs, |s| { | 58 | if self.update_with_cs(cs, |s| { |
| 59 | if (*s & STATE_RUN_QUEUED != 0) || (*s & STATE_SPAWNED == 0) { | 59 | let ok = *s & STATE_RUN_QUEUED == 0; |
| 60 | false | 60 | *s |= STATE_RUN_QUEUED; |
| 61 | } else { | 61 | ok |
| 62 | *s |= STATE_RUN_QUEUED; | ||
| 63 | true | ||
| 64 | } | ||
| 65 | }) { | 62 | }) { |
| 66 | f(cs); | 63 | f(cs); |
| 67 | } | 64 | } |
