aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/export.rs25
-rw-r--r--src/export/executor.rs11
2 files changed, 9 insertions, 27 deletions
diff --git a/src/export.rs b/src/export.rs
index 6017dcf7..cdca9727 100644
--- a/src/export.rs
+++ b/src/export.rs
@@ -1,5 +1,4 @@
pub use bare_metal::CriticalSection;
-use core::sync::atomic::{AtomicBool, Ordering};
pub use cortex_m::{
asm::nop,
asm::wfi,
@@ -7,6 +6,8 @@ pub use cortex_m::{
peripheral::{scb::SystemHandler, DWT, NVIC, SCB, SYST},
Peripherals,
};
+//pub use portable_atomic as atomic;
+pub use atomic_polyfill as atomic;
pub mod executor;
@@ -72,28 +73,6 @@ where
f();
}
-pub struct Barrier {
- inner: AtomicBool,
-}
-
-impl Barrier {
- pub const fn new() -> Self {
- Barrier {
- inner: AtomicBool::new(false),
- }
- }
-
- pub fn release(&self) {
- self.inner.store(true, Ordering::Release);
- }
-
- pub fn wait(&self) {
- while !self.inner.load(Ordering::Acquire) {
- core::hint::spin_loop()
- }
- }
-}
-
/// Const helper to check architecture
pub const fn have_basepri() -> bool {
#[cfg(have_basepri)]
diff --git a/src/export/executor.rs b/src/export/executor.rs
index 874ee192..2f88eff9 100644
--- a/src/export/executor.rs
+++ b/src/export/executor.rs
@@ -1,9 +1,9 @@
+use super::atomic::{AtomicBool, Ordering};
use core::{
cell::UnsafeCell,
future::Future,
mem::{self, MaybeUninit},
pin::Pin,
- sync::atomic::{AtomicBool, Ordering},
task::{Context, Poll, RawWaker, RawWakerVTable, Waker},
};
@@ -53,9 +53,11 @@ impl<F: Future> AsyncTaskExecutor<F> {
self.running.load(Ordering::Relaxed)
}
- /// Checks if a waker has pended the executor.
- pub fn is_pending(&self) -> bool {
- self.pending.load(Ordering::Relaxed)
+ /// Checks if a waker has pended the executor and simultaneously clears the flag.
+ pub fn check_and_clear_pending(&self) -> bool {
+ self.pending
+ .compare_exchange(true, false, Ordering::Relaxed, Ordering::Relaxed)
+ .is_ok()
}
// Used by wakers to indicate that the executor needs to run.
@@ -80,6 +82,7 @@ impl<F: Future> AsyncTaskExecutor<F> {
debug_assert!(self.running.load(Ordering::Relaxed));
self.task.get().write(MaybeUninit::new(future));
+ self.set_pending();
}
/// Poll the future in the executor.