pub mod fallback;
mod gen_future;
pub use self::gen_future::from_generator;
use crate::thr::{local, TaskCell, Thread, ThreadLocal};
use core::{
future::Future,
mem::transmute,
pin::Pin,
sync::atomic::{AtomicUsize, Ordering},
task::Poll,
};
static LOCAL_TASK_FN: AtomicUsize = AtomicUsize::new(0);
pub fn init<T: Thread>() {
LOCAL_TASK_FN.store(local_task_fn::<T> as usize, Ordering::Relaxed);
}
pub fn poll_with_context<F>(f: Pin<&mut F>) -> Poll<F::Output>
where
F: Future,
{
local_task().get_context(|cx| F::poll(f, cx))
}
fn local_task() -> &'static TaskCell {
let ptr = LOCAL_TASK_FN.load(Ordering::Relaxed);
if ptr == 0 {
panic!("drone_core::future::init not called");
} else {
unsafe { transmute::<usize, unsafe fn() -> &'static TaskCell>(ptr)() }
}
}
unsafe fn local_task_fn<T: Thread>() -> &'static TaskCell {
local::<T>().task()
}