aboutsummaryrefslogtreecommitdiff
path: root/embassy-executor
diff options
context:
space:
mode:
authorDániel Buga <[email protected]>2024-12-17 17:14:59 +0100
committerDániel Buga <[email protected]>2024-12-17 17:15:40 +0100
commit889b419fc40f252726dbdc8a67bc4d27aa5b81f3 (patch)
tree169419cb049bb5485ae4e93ed247063adcc1e161 /embassy-executor
parentc6ca46c82529e014aaceb218ad88978c50f0db07 (diff)
Simplify ARM run_enqueue
Diffstat (limited to 'embassy-executor')
-rw-r--r--embassy-executor/src/raw/state_atomics_arm.rs21
1 files changed, 3 insertions, 18 deletions
diff --git a/embassy-executor/src/raw/state_atomics_arm.rs b/embassy-executor/src/raw/state_atomics_arm.rs
index 06bf24343..cbda0d89d 100644
--- a/embassy-executor/src/raw/state_atomics_arm.rs
+++ b/embassy-executor/src/raw/state_atomics_arm.rs
@@ -1,4 +1,3 @@
1use core::arch::asm;
2use core::sync::atomic::{compiler_fence, AtomicBool, AtomicU32, Ordering}; 1use core::sync::atomic::{compiler_fence, AtomicBool, AtomicU32, Ordering};
3 2
4#[derive(Clone, Copy)] 3#[derive(Clone, Copy)]
@@ -67,24 +66,10 @@ impl State {
67 /// function if the task was successfully marked. 66 /// function if the task was successfully marked.
68 #[inline(always)] 67 #[inline(always)]
69 pub fn run_enqueue(&self, f: impl FnOnce(Token)) { 68 pub fn run_enqueue(&self, f: impl FnOnce(Token)) {
70 unsafe { 69 let old = self.run_queued.swap(true, Ordering::AcqRel);
71 loop {
72 let state: u32;
73 asm!("ldrex {}, [{}]", out(reg) state, in(reg) self, options(nostack));
74 70
75 if state & STATE_RUN_QUEUED != 0 { 71 if !old {
76 asm!("clrex", options(nomem, nostack)); 72 locked(f);
77 return;
78 }
79
80 let outcome: usize;
81 let new_state = state | STATE_RUN_QUEUED;
82 asm!("strex {}, {}, [{}]", out(reg) outcome, in(reg) new_state, in(reg) self, options(nostack));
83 if outcome == 0 {
84 locked(f);
85 return;
86 }
87 }
88 } 73 }
89 } 74 }
90 75