use std::collections::VecDeque;
use crate::sendable::SendableValue;
use crate::vm::VM;
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub struct Pid(pub u64);
#[derive(Debug)]
pub enum BlockReason {
Receive,
Await(Pid),
}
#[derive(Debug)]
pub enum ProcessStatus {
Runnable,
Blocked(BlockReason),
Done,
Failed(String),
}
pub struct Process {
pub pid: Pid,
pub vm: VM,
pub mailbox: VecDeque<SendableValue>,
pub status: ProcessStatus,
pub parent: Option<Pid>,
pub result: Option<SendableValue>,
}
impl Process {
pub fn new(pid: Pid, vm: VM, parent: Option<Pid>) -> Self {
Self {
pid,
vm,
mailbox: VecDeque::new(),
status: ProcessStatus::Runnable,
parent,
result: None,
}
}
pub fn is_runnable(&self) -> bool {
matches!(self.status, ProcessStatus::Runnable)
}
pub fn is_done(&self) -> bool {
matches!(self.status, ProcessStatus::Done | ProcessStatus::Failed(_))
}
}