hirun/runtime/
waker.rs

1use super::RawTask;
2use core::task::{RawWaker, RawWakerVTable, Waker};
3
4impl RawTask {
5    pub(crate) fn task_waker(&self) -> Waker {
6        let raw_waker = RawWaker::new((self as *const Self).cast::<()>(), &TASKWAKER_VTABLE);
7        unsafe { Waker::from_raw(raw_waker) }
8    }
9}
10
11const RAWWAKER_VTABLE: RawWakerVTable =
12    RawWakerVTable::new(waker_clone, waker_wake, waker_wake_by_ref, waker_drop);
13
14unsafe fn waker_clone(this: *const ()) -> RawWaker {
15    let task = unsafe { &*this.cast::<RawTask>() };
16    task.inc_ref();
17    RawWaker::new(this, &RAWWAKER_VTABLE)
18}
19
20unsafe fn waker_wake(this: *const ()) {
21    let task = unsafe { &*this.cast::<RawTask>() };
22    task.wake();
23    task.dec_ref();
24}
25
26unsafe fn waker_wake_by_ref(this: *const ()) {
27    let task = unsafe { &*this.cast::<RawTask>() };
28    task.wake();
29}
30
31unsafe fn waker_drop(this: *const ()) {
32    let task = unsafe { &*this.cast::<RawTask>() };
33    task.dec_ref();
34}
35
36const TASKWAKER_VTABLE: RawWakerVTable = RawWakerVTable::new(
37    waker_clone,
38    waker_wake_by_ref,
39    waker_wake_by_ref,
40    task_waker_drop,
41);
42
43unsafe fn task_waker_drop(_this: *const ()) {}