aboutsummaryrefslogtreecommitdiff
path: root/embassy-executor
diff options
context:
space:
mode:
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