use core::task::Waker;
use core::ptr::NonNull;
pub struct Waiter {
waker: Waker,
registered: NonNull<atomic!(AtomicBool, ty)>
}
impl Waiter {
#[inline] #[must_use]
pub unsafe fn new(waker: Waker, registered: &mut atomic!(AtomicBool, ty)) -> Self {
Self {
waker,
registered: unsafe { NonNull::new_unchecked(registered as *mut _) }
}
}
pub fn set_registered(&self, is_registered: bool) {
unsafe { self.registered.as_ref().store(is_registered, ordering!(Release)) }
}
#[inline]
pub fn wake(self) {
self.set_registered(false);
self.waker.wake();
}
#[inline]
pub fn inner_wake(self) {
self.waker.wake();
}
}
unsafe impl Send for Waiter {}
unsafe impl Sync for Waiter {}