use std::cell::UnsafeCell;
use std::task::Waker;
use crate::UnsendMarker;
#[derive(Default)]
pub struct UnsyncWaker {
waker: UnsafeCell<Option<Waker>>,
_unsend_marker: UnsendMarker,
}
impl UnsyncWaker {
pub fn register(&self, waker: &Waker) {
unsafe {
if let Some(old_waker) = &mut *self.waker.get() {
if old_waker.will_wake(waker) {
return;
}
}
*self.waker.get() = Some(waker.clone())
}
}
pub fn wake(&self) {
unsafe {
if let Some(waker) = (*self.waker.get()).take() {
waker.wake();
}
}
}
pub fn wake_by_ref(&self) {
unsafe {
if let Some(waker) = &mut *self.waker.get() {
waker.wake_by_ref();
}
}
}
}