use crate::process::ExitReason;
use std::fmt;
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum SupervisionError {
NoProc,
NoCaller,
}
impl fmt::Display for SupervisionError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::NoProc => f.write_str("target process does not exist"),
Self::NoCaller => f.write_str("caller process identity unknown"),
}
}
}
impl std::error::Error for SupervisionError {}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub struct MonitorResult {
pub reference: u64,
pub immediate_down: bool,
}
pub trait SupervisionFacility: Send + Sync {
fn monitor(&self, caller_pid: u64, target_pid: u64) -> Result<MonitorResult, SupervisionError>;
fn demonitor(&self, caller_pid: u64, reference: u64) -> Result<(), SupervisionError>;
fn exit_signal(
&self,
caller_pid: u64,
target_pid: u64,
reason: ExitReason,
) -> Result<(), SupervisionError>;
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum SupervisionRecord {
Monitor { caller_pid: u64, target_pid: u64 },
Demonitor { caller_pid: u64, reference: u64 },
ExitSignal {
caller_pid: u64,
target_pid: u64,
reason: ExitReason,
},
}