aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Salzedo <[email protected]>2021-03-24 13:19:05 -0700
committerJoshua Salzedo <[email protected]>2021-03-24 13:19:36 -0700
commit40617fea043538833e40bec1694c17be6faf5077 (patch)
tree077d46c9b7334f3945e84757bb5262d90d2dfd28
parent62009150bd3655f36c3f6247d5d339258212cb2f (diff)
Document embassy::util::signal & embassy::util
-rw-r--r--embassy/src/util/mod.rs1
-rw-r--r--embassy/src/util/signal.rs7
2 files changed, 7 insertions, 1 deletions
diff --git a/embassy/src/util/mod.rs b/embassy/src/util/mod.rs
index e64e7f1f1..6917e9993 100644
--- a/embassy/src/util/mod.rs
+++ b/embassy/src/util/mod.rs
@@ -1,3 +1,4 @@
1//! Async utilities
1mod drop_bomb; 2mod drop_bomb;
2mod forever; 3mod forever;
3mod mutex; 4mod mutex;
diff --git a/embassy/src/util/signal.rs b/embassy/src/util/signal.rs
index e3c5fad1d..12dc7c318 100644
--- a/embassy/src/util/signal.rs
+++ b/embassy/src/util/signal.rs
@@ -10,6 +10,9 @@ use crate::executor;
10use crate::fmt::panic; 10use crate::fmt::panic;
11use crate::interrupt::{Interrupt, InterruptExt}; 11use crate::interrupt::{Interrupt, InterruptExt};
12 12
13/// Synchronization primitive. Allows creating awaitable signals that may be passed between tasks.
14///
15/// For more advanced use cases, please consider [futures-intrusive](https://crates.io/crates/futures-intrusive) channels or mutexes.
13pub struct Signal<T> { 16pub struct Signal<T> {
14 state: UnsafeCell<State<T>>, 17 state: UnsafeCell<State<T>>,
15} 18}
@@ -29,7 +32,7 @@ impl<T: Send> Signal<T> {
29 state: UnsafeCell::new(State::None), 32 state: UnsafeCell::new(State::None),
30 } 33 }
31 } 34 }
32 35 /// Mark this Signal as completed.
33 pub fn signal(&self, val: T) { 36 pub fn signal(&self, val: T) {
34 cortex_m::interrupt::free(|_| unsafe { 37 cortex_m::interrupt::free(|_| unsafe {
35 let state = &mut *self.state.get(); 38 let state = &mut *self.state.get();
@@ -64,10 +67,12 @@ impl<T: Send> Signal<T> {
64 }) 67 })
65 } 68 }
66 69
70 /// Future that completes when this Signal has been signaled.
67 pub fn wait(&self) -> impl Future<Output = T> + '_ { 71 pub fn wait(&self) -> impl Future<Output = T> + '_ {
68 futures::future::poll_fn(move |cx| self.poll_wait(cx)) 72 futures::future::poll_fn(move |cx| self.poll_wait(cx))
69 } 73 }
70 74
75 /// non-blocking method to check whether this signal has been signaled.
71 pub fn signaled(&self) -> bool { 76 pub fn signaled(&self) -> bool {
72 cortex_m::interrupt::free(|_| matches!(unsafe { &*self.state.get() }, State::Signaled(_))) 77 cortex_m::interrupt::free(|_| matches!(unsafe { &*self.state.get() }, State::Signaled(_)))
73 } 78 }