mod utils;
pub(crate) mod waker_fn;
mod core;
use self::core::{Cell, Header};
mod harness;
use self::harness::Harness;
mod join;
#[allow(unreachable_pub)] pub use self::join::JoinHandle;
mod raw;
use self::raw::RawTask;
mod state;
mod waker;
use std::{future::Future, marker::PhantomData, ptr::NonNull};
#[repr(transparent)]
pub(crate) struct Task<S: 'static> {
raw: RawTask,
_p: PhantomData<S>,
}
impl<S: 'static> Task<S> {
unsafe fn from_raw(ptr: NonNull<Header>) -> Task<S> {
Task {
raw: RawTask::from_raw(ptr),
_p: PhantomData,
}
}
fn header(&self) -> &Header {
self.raw.header()
}
pub(crate) fn run(self) {
self.raw.poll();
}
#[cfg(feature = "sync")]
pub(crate) unsafe fn finish(&mut self, val_slot: *mut ()) {
self.raw.finish(val_slot);
}
}
impl<S: 'static> Drop for Task<S> {
fn drop(&mut self) {
if self.header().state.ref_dec() {
self.raw.dealloc();
}
}
}
pub(crate) trait Schedule: Sized + 'static {
fn schedule(&self, task: Task<Self>);
fn yield_now(&self, task: Task<Self>) {
self.schedule(task);
}
}
pub(crate) fn new_task<T, S>(
owner_id: usize,
task: T,
scheduler: S,
) -> (Task<S>, JoinHandle<T::Output>)
where
S: Schedule,
T: Future + 'static,
T::Output: 'static,
{
new_task_holding(owner_id, task, scheduler)
}
pub(crate) fn new_task_holding<T, S>(
owner_id: usize,
task: T,
scheduler: S,
) -> (Task<S>, JoinHandle<T::Output>)
where
S: Schedule,
T: Future,
{
let raw = RawTask::new::<T, S>(owner_id, task, scheduler);
let task = Task {
raw,
_p: PhantomData,
};
let join = JoinHandle::new(raw);
(task, join)
}