use std::fmt::Debug;
use std::sync::Arc;
use serde::Deserialize;
use serde::Serialize;
use crate::CallbackSignalSite;
use crate::ExitStatus;
use crate::ProcessAlarmSignalDisposition;
use crate::SignalEvent;
use crate::SignalProcessId;
use crate::SignalTaskIdentity;
use crate::syscalls::Errno;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum BackendSignalControlMode {
Unchanged,
ToolControlled,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ProcessSignalPublication {
pub process: SignalProcessId,
pub pending_generation: u64,
pub coalesced: bool,
pub disposition: ProcessAlarmSignalDisposition,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum ProcessSignalPublicationResult {
RejectedBeforeCommit(Errno),
Committed(ProcessSignalPublication),
FailedAfterCommit {
receipt: ProcessSignalPublication,
errno: Errno,
},
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ChildExitCompletion {
pub parent: SignalProcessId,
pub child: SignalProcessId,
pub status: ExitStatus,
pub waitable: bool,
pub uid: u32,
pub user_ticks: i64,
pub system_ticks: i64,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum ChildExitPublicationEffect {
Queued,
Coalesced,
SuppressedExplicitIgnore,
DiscardedByDispositionChange,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ChildExitPublication {
pub completion: ChildExitCompletion,
pub pending_generation: u64,
pub effect: ChildExitPublicationEffect,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum ChildExitPublicationResult {
RejectedBeforeCommit(Errno),
Committed(ChildExitPublication),
FailedAfterCommit {
receipt: ChildExitPublication,
errno: Errno,
},
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct SignalRecipient {
pub task: SignalTaskIdentity,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct SignalDeliveryPermit {
pub task: SignalTaskIdentity,
pub sequence: u64,
pub site: Option<CallbackSignalSite>,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum SignalBoundaryOutcome {
Caught,
NoHandler,
Terminated {
group: bool,
wait_status: i32,
},
ImageReplaced,
Cancelled,
Failed,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct SignalBoundaryReceipt {
pub permit: SignalDeliveryPermit,
pub outcome: SignalBoundaryOutcome,
}
pub trait ProcessSignalControl: Debug + Send + Sync {
fn publish_alarm(
&self,
process: SignalProcessId,
event: SignalEvent,
) -> ProcessSignalPublicationResult;
fn publish_child_exit(&self, _completion: ChildExitCompletion) -> ChildExitPublicationResult {
ChildExitPublicationResult::RejectedBeforeCommit(Errno::ENOSYS)
}
fn signal_recipients(
&self,
process: SignalProcessId,
signal: i32,
) -> Result<Vec<SignalRecipient>, Errno>;
fn alarm_recipients(&self, process: SignalProcessId) -> Result<Vec<SignalRecipient>, Errno> {
self.signal_recipients(process, libc::SIGALRM)
}
fn reserve_delivery(&self, permit: SignalDeliveryPermit) -> Result<(), Errno>;
fn release_delivery(&self, permit: SignalDeliveryPermit) -> Result<(), Errno>;
fn finish_publication_failure(&self, process: SignalProcessId) -> Result<(), Errno>;
fn finish_child_exit_publication_failure(
&self,
_receipt: ChildExitPublication,
) -> Result<(), Errno> {
Err(Errno::ENOSYS)
}
}
#[derive(Clone, Debug)]
pub struct BackendSignalControl {
pub process: Arc<dyn ProcessSignalControl>,
}