use crate::channel::ChanId;
use crate::payload::RtPayload;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct TaskId(pub u64);
#[derive(Debug, Clone)]
pub enum SelectArm {
Recv(ChanId),
Timeout(u64),
}
pub enum TaskStep<'t> {
Yield,
Recv(ChanId),
Send(ChanId, RtPayload),
TrySend(ChanId, RtPayload),
TryRecv(ChanId),
Select(Vec<SelectArm>),
Sleep(u64),
NewChan(Option<usize>),
Spawn(Box<dyn Task<'t> + 't>),
SpawnDesc { func: u16, args: Vec<RtPayload>, want_handle: bool },
Await(TaskId),
Abort(TaskId),
Close(ChanId),
IoPending,
Exit(RtPayload),
}
pub struct TaskCtx {
pub resumed_with: RtPayload,
pub selected_arm: Option<usize>,
pub new_chan: Option<ChanId>,
pub spawned: Option<TaskId>,
}
pub trait Task<'t> {
fn poll(&mut self, ctx: &mut TaskCtx) -> TaskStep<'t>;
fn priority(&self) -> u8 {
0
}
fn take_output(&mut self) -> Vec<String> {
Vec::new()
}
}