Rename WakerStore -> WakerRegistration.

This commit is contained in:
Dario Nieuwenhuis
2021-01-01 22:30:11 +01:00
parent ffb92731cd
commit 4783222f67
4 changed files with 47 additions and 32 deletions

View File

@ -2,10 +2,10 @@ mod drop_bomb;
mod forever;
mod portal;
mod signal;
mod waker_store;
mod waker;
pub use drop_bomb::*;
pub use forever::*;
pub use portal::*;
pub use signal::*;
pub use waker_store::*;
pub use waker::*;

38
embassy/src/util/waker.rs Normal file
View File

@ -0,0 +1,38 @@
use core::task::Context;
use core::task::Waker;
/// Utility struct to register and wake a waker.
#[derive(Debug)]
pub struct WakerRegistration {
waker: Option<Waker>,
}
impl WakerRegistration {
pub const fn new() -> Self {
Self { waker: None }
}
/// Register a waker. Overwrites the previous waker, if any.
pub fn register(&mut self, w: &Waker) {
match self.waker {
// Optimization: If both the old and new Wakers wake the same task, we can simply
// keep the old waker, skipping the clone. (In most executor implementations,
// cloning a waker is somewhat expensive, comparable to cloning an Arc).
Some(ref w2) if (w2.will_wake(w)) => {}
// In all other cases
// - we have no waker registered
// - we have a waker registered but it's for a different task.
// then clone the new waker and store it
_ => self.waker = Some(w.clone()),
}
}
/// Wake the registered waker, if any.
pub fn wake(&mut self) {
self.waker.take().map(|w| w.wake());
}
pub fn context(&self) -> Option<Context<'_>> {
self.waker.as_ref().map(|w| Context::from_waker(w))
}
}

View File

@ -1,23 +0,0 @@
use core::task::Waker;
pub struct WakerStore {
waker: Option<Waker>,
}
impl WakerStore {
pub const fn new() -> Self {
Self { waker: None }
}
pub fn store(&mut self, w: &Waker) {
match self.waker {
Some(ref w2) if (w2.will_wake(w)) => {}
Some(_) => panic!("Waker overflow"),
None => self.waker = Some(w.clone()),
}
}
pub fn wake(&mut self) {
self.waker.take().map(|w| w.wake());
}
}