pub mod sync {
crate::cfg_loom! {
pub use futures_util::task::AtomicWaker as WakerSlot;
}
impl crate::AssertMt for WakerSlot {}
}
pub mod unsync {
use std::{cell::RefCell, task::Waker};
#[derive(Debug, Default)]
pub struct WakerSlot {
waker: RefCell<Option<Waker>>,
}
impl WakerSlot {
pub const fn new() -> Self {
Self {
waker: RefCell::new(None),
}
}
pub fn register(&self, waker: &Waker) {
let mut w = self.waker.borrow_mut();
if w.as_ref().is_some_and(|x| x.will_wake(waker)) {
return;
}
*w = Some(waker.clone())
}
pub fn take(&self) -> Option<Waker> {
self.waker.borrow_mut().take()
}
pub fn wake(&self) {
if let Some(waker) = self.take() {
waker.wake()
}
}
}
}