use core::task::Waker; use super::WakerRegistration; /// Utility struct to register and wake multiple wakers. pub struct MultiWakerRegistration { wakers: [WakerRegistration; N], } impl MultiWakerRegistration { /// Create a new empty instance pub const fn new() -> Self { const WAKER: WakerRegistration = WakerRegistration::new(); Self { wakers: [WAKER; N] } } /// Register a waker. If the buffer is full the function returns it in the error pub fn register<'a>(&mut self, w: &'a Waker) -> Result<(), &'a Waker> { if let Some(waker_slot) = self.wakers.iter_mut().find(|waker_slot| !waker_slot.occupied()) { waker_slot.register(w); Ok(()) } else { Err(w) } } /// Wake all registered wakers. This clears the buffer pub fn wake(&mut self) { for waker_slot in self.wakers.iter_mut() { waker_slot.wake() } } }