use core::task::{RawWaker, RawWakerVTable, Waker};
use super::{TaskHeader, TaskRef, wake_task};
static VTABLE: RawWakerVTable = RawWakerVTable::new(clone, wake, wake, drop);
unsafe fn clone(p: *const ()) -> RawWaker {
RawWaker::new(p, &VTABLE)
}
unsafe fn wake(p: *const ()) {
wake_task(TaskRef::from_ptr(p as *const TaskHeader))
}
unsafe fn drop(_: *const ()) {
}
pub(crate) unsafe fn from_task(p: TaskRef) -> Waker {
Waker::from_raw(RawWaker::new(p.as_ptr() as _, &VTABLE))
}
pub fn task_from_waker(waker: &Waker) -> TaskRef {
unwrap!(
try_task_from_waker(waker),
"Found waker not created by the Embassy executor. Unless the generic timer queue is enabled, `embassy_time::Timer` only works with the Embassy executor."
)
}
pub(crate) fn try_task_from_waker(waker: &Waker) -> Option<TaskRef> {
if waker.vtable() as *const _ != &VTABLE as *const _ {
return None;
}
Some(unsafe { TaskRef::from_ptr(waker.data() as *const TaskHeader) })
}