use crate::runtime::local_executor;
use crate::runtime::task::Task;
use std::task::{RawWaker, RawWakerVTable, Waker};
#[inline(always)]
unsafe fn clone(data_ptr: *const ()) -> RawWaker {
RawWaker::new(data_ptr, &VTABLE)
}
macro_rules! generate_wake {
($data_ptr:expr) => {
let task = unsafe { ($data_ptr as *mut Task).read() };
if task.is_local() {
local_executor().spawn_local_task(task);
} else {
local_executor().spawn_shared_task(task);
}
};
}
#[inline(always)]
unsafe fn wake(data_ptr: *const ()) {
generate_wake!(data_ptr);
}
#[inline(always)]
unsafe fn wake_by_ref(data_ptr: *const ()) {
generate_wake!(data_ptr);
}
#[inline(always)]
unsafe fn drop(_data_ptr: *const ()) {
}
pub const VTABLE: RawWakerVTable = RawWakerVTable::new(clone, wake, wake_by_ref, drop);
#[inline(always)]
pub fn create_waker(task_ptr: *mut Task) -> Waker {
unsafe { Waker::from_raw(RawWaker::new(task_ptr as *const (), &VTABLE)) }
}