use serde::Deserialize;
use serde::Serialize;
use crate::Pid;
use crate::SignalEvent;
use crate::syscalls::Errno;
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct SignalProcessId {
pub tgid: Pid,
pub generation: u64,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct SignalTaskIdentity {
pub process: SignalProcessId,
pub tid: Pid,
pub task_generation: u64,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct CallbackSignalSite {
pub process: SignalProcessId,
pub tid: Pid,
pub task_generation: u64,
pub callback_nonce: u64,
pub boundary_nonce: u64,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum PendingDomain {
Thread,
Process,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum SignalConsumer {
ReturnToUser,
SignalFd,
SignalTimedWait,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct DequeueId {
pub process: SignalProcessId,
pub sequence: u64,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct SignalDequeue {
pub process: SignalProcessId,
pub sequence: u64,
pub consumer: SignalConsumer,
pub domain: PendingDomain,
pub event: SignalEvent,
}
impl SignalDequeue {
pub const fn id(self) -> DequeueId {
DequeueId {
process: self.process,
sequence: self.sequence,
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ParkedObservationLease {
pub nonce: u64,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct PreparedSignalToken {
pub site: CallbackSignalSite,
pub selection_nonce: u64,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum SignalObservationStep {
Ignored {
dequeue: DequeueId,
},
Suppressed {
dequeue: DequeueId,
},
Reblocked {
dequeue: DequeueId,
domain: PendingDomain,
},
Caught {
dequeue: DequeueId,
},
Fatal {
dequeue: DequeueId,
},
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum SignalObservationStop {
NoEligibleSignal,
Caught(PreparedSignalToken),
Fatal(PreparedSignalToken),
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ParkedSignalObservation {
pub steps: Vec<SignalObservationStep>,
pub stop: SignalObservationStop,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum SignalObservationFailure {
RejectedBeforeRemoval {
errno: Errno,
},
FailedAfterRemoval {
dequeue: DequeueId,
errno: Errno,
},
CancelledAfterEffects {
last_dequeue: Option<DequeueId>,
},
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ParkedSignalFailureContext {
pub site: CallbackSignalSite,
pub ledger_nonce: u64,
}