use crate::runtime::execution::ExecutionState;
use crate::runtime::task::TaskId;
use std::task::{RawWaker, RawWakerVTable, Waker};
pub(crate) fn make_waker(task_id: TaskId) -> Waker {
let data = task_id.0 as *const ();
unsafe { Waker::from_raw(RawWaker::new(data, &RAW_WAKER_VTABLE)) }
}
unsafe fn raw_waker_clone(data: *const ()) -> RawWaker {
RawWaker::new(data, &RAW_WAKER_VTABLE)
}
unsafe fn raw_waker_wake(data: *const ()) {
let task_id = TaskId::from(data as usize);
ExecutionState::with(|state| {
if state.is_finished() {
return;
}
let waiter = state.get_mut(task_id);
if waiter.finished() {
return;
}
waiter.wake();
});
}
unsafe fn raw_waker_wake_by_ref(data: *const ()) {
raw_waker_wake(data);
}
unsafe fn raw_waker_drop(_data: *const ()) {
}
const RAW_WAKER_VTABLE: RawWakerVTable =
RawWakerVTable::new(raw_waker_clone, raw_waker_wake, raw_waker_wake_by_ref, raw_waker_drop);