diff options
Diffstat (limited to 'embassy-executor')
| -rw-r--r-- | embassy-executor/src/raw/state_atomics_arm.rs | 21 |
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 @@ | |||
| 1 | use core::arch::asm; | ||
| 2 | use core::sync::atomic::{compiler_fence, AtomicBool, AtomicU32, Ordering}; | 1 | use 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 | ||
