1use crate::{UserData, BoxedPoll, Box, global};
2
3pub type ExternTask = UserData;
5
6pub type ExternData = UserData;
8
9pub type InternTask = UserData;
11
12pub type TaskPoll = extern "C" fn(InternTask) -> bool;
16
17pub type TaskDrop = extern "C" fn(InternTask);
21
22pub type TaskNew = extern "C" fn(ExternData) -> ExternTask;
24
25pub type TaskRun = extern "C" fn(ExternTask, InternTask);
27
28pub type TaskWake = extern "C" fn(ExternTask);
32
33#[export_name = "rust_async_executor_init"]
35pub extern "C" fn loop_init(task_new: TaskNew, task_run: TaskRun, task_wake: TaskWake, task_data: ExternData) {
36 use global::*;
37
38 unsafe {
39 TASK_NEW = task_new as _;
40 TASK_RUN = task_run as _;
41 TASK_WAKE = task_wake as _;
42 TASK_DATA = task_data as _;
43 }
44}
45
46#[export_name = "rust_async_executor_poll"]
48pub extern "C" fn task_poll(data: InternTask) -> bool {
49 let poll = unsafe { &mut *(data as *mut BoxedPoll) };
50 poll()
51}
52
53#[export_name = "rust_async_executor_drop"]
55pub extern "C" fn task_drop(data: InternTask) {
56 let _poll = unsafe { Box::from_raw(data as *mut BoxedPoll) };
57}