diff options
| author | Joshua Salzedo <[email protected]> | 2021-03-24 13:19:05 -0700 |
|---|---|---|
| committer | Joshua Salzedo <[email protected]> | 2021-03-24 13:19:36 -0700 |
| commit | 40617fea043538833e40bec1694c17be6faf5077 (patch) | |
| tree | 077d46c9b7334f3945e84757bb5262d90d2dfd28 | |
| parent | 62009150bd3655f36c3f6247d5d339258212cb2f (diff) | |
Document embassy::util::signal & embassy::util
| -rw-r--r-- | embassy/src/util/mod.rs | 1 | ||||
| -rw-r--r-- | embassy/src/util/signal.rs | 7 |
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 | ||
| 1 | mod drop_bomb; | 2 | mod drop_bomb; |
| 2 | mod forever; | 3 | mod forever; |
| 3 | mod mutex; | 4 | mod 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; | |||
| 10 | use crate::fmt::panic; | 10 | use crate::fmt::panic; |
| 11 | use crate::interrupt::{Interrupt, InterruptExt}; | 11 | use 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. | ||
| 13 | pub struct Signal<T> { | 16 | pub 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 | } |
