use alloc::sync::Arc;
use core::task::Waker;
use crate::DiatomicWaker;
use crate::WaitUntil;
#[derive(Debug, Default)]
pub struct WakeSink {
inner: Arc<DiatomicWaker>,
}
impl WakeSink {
pub fn new() -> Self {
Self {
inner: Arc::new(DiatomicWaker::new()),
}
}
#[inline]
pub fn source(&self) -> WakeSource {
WakeSource {
inner: self.inner.clone(),
}
}
#[inline]
pub fn register(&mut self, waker: &Waker) {
unsafe { self.inner.register(waker) };
}
#[inline]
pub fn unregister(&mut self) {
unsafe { self.inner.unregister() };
}
#[inline]
pub fn wait_until<P, T>(&mut self, predicate: P) -> WaitUntil<'_, P, T>
where
P: FnMut() -> Option<T>,
{
unsafe { self.inner.wait_until(predicate) }
}
}
#[derive(Clone, Debug)]
pub struct WakeSource {
inner: Arc<DiatomicWaker>,
}
impl WakeSource {
#[inline]
pub fn notify(&self) {
self.inner.notify();
}
}