use crate::task::{RawWaker, RawWakerVTable, Waker};
use alloc::sync::Arc;
use core::sync::atomic::{AtomicBool, Ordering};
static TASK_WAKER_VTABLE: RawWakerVTable = RawWakerVTable::new(
|ptr| {
let arc = unsafe { Arc::from_raw(ptr as *const AtomicBool) };
let cloned = Arc::clone(&arc);
core::mem::forget(arc);
RawWaker::new(Arc::into_raw(cloned) as *const (), &TASK_WAKER_VTABLE)
},
|ptr| {
let arc = unsafe { Arc::from_raw(ptr as *const AtomicBool) };
arc.store(true, Ordering::Release);
},
|ptr| {
let arc = unsafe { Arc::from_raw(ptr as *const AtomicBool) };
arc.store(true, Ordering::Release);
core::mem::forget(arc);
},
|ptr| {
drop(unsafe { Arc::from_raw(ptr as *const AtomicBool) });
},
);
pub(crate) fn task_waker(flag: Arc<AtomicBool>) -> Waker {
let ptr = Arc::into_raw(flag) as *const ();
unsafe { Waker::from_raw(RawWaker::new(ptr, &TASK_WAKER_VTABLE)) }
}
pub(crate) fn noop_waker() -> Waker {
static VTABLE: RawWakerVTable = RawWakerVTable::new(
|_| RawWaker::new(core::ptr::null(), &VTABLE),
|_| {},
|_| {},
|_| {},
);
unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &VTABLE)) }
}