use open_coroutine_core::common::JoinHandle;
use open_coroutine_core::coroutine::suspender::SuspenderImpl;
use open_coroutine_core::net::event_loop::join::TaskJoinHandleImpl;
use open_coroutine_core::net::event_loop::{EventLoops, UserFunc};
use std::ffi::{c_long, c_void};
use std::time::Duration;
#[no_mangle]
pub extern "C" fn task_crate(f: UserFunc, param: usize) -> TaskJoinHandleImpl {
EventLoops::submit(
move |suspender, p| {
#[allow(clippy::cast_ptr_alignment, clippy::ptr_as_ptr)]
Some(f(
suspender as *const _ as *const SuspenderImpl<(), ()>,
p.unwrap_or(0),
))
},
Some(param),
)
}
#[no_mangle]
pub extern "C" fn task_join(handle: TaskJoinHandleImpl) -> c_long {
match handle.join() {
Ok(ptr) => match ptr {
Ok(ptr) => match ptr {
Some(ptr) => ptr as *mut c_void as c_long,
None => 0,
},
Err(_) => -1,
},
Err(_) => -1,
}
}
#[no_mangle]
pub extern "C" fn task_timeout_join(handle: &TaskJoinHandleImpl, ns_time: u64) -> c_long {
match handle.timeout_join(Duration::from_nanos(ns_time)) {
Ok(ptr) => match ptr {
Ok(ptr) => match ptr {
Some(ptr) => ptr as *mut c_void as c_long,
None => 0,
},
Err(_) => -1,
},
Err(_) => -1,
}
}