use crate::{UserData, BoxedPoll, Box, global};
pub type ExternTask = UserData;
pub type ExternData = UserData;
pub type InternTask = UserData;
pub type TaskPoll = extern "C" fn(InternTask) -> bool;
pub type TaskDrop = extern "C" fn(InternTask);
pub type TaskNew = extern "C" fn(ExternData) -> ExternTask;
pub type TaskRun = extern "C" fn(ExternTask, InternTask);
pub type TaskWake = extern "C" fn(ExternTask);
#[export_name = "rust_async_executor_init"]
pub extern "C" fn loop_init(task_new: TaskNew, task_run: TaskRun, task_wake: TaskWake, task_data: ExternData) {
use global::*;
unsafe {
TASK_NEW = task_new as _;
TASK_RUN = task_run as _;
TASK_WAKE = task_wake as _;
TASK_DATA = task_data as _;
}
}
#[export_name = "rust_async_executor_poll"]
pub extern "C" fn task_poll(data: InternTask) -> bool {
let poll = unsafe { &mut *(data as *mut BoxedPoll) };
poll()
}
#[export_name = "rust_async_executor_drop"]
pub extern "C" fn task_drop(data: InternTask) {
let _poll = unsafe { Box::from_raw(data as *mut BoxedPoll) };
}