#[cfg(unix)]
use signal_hook::consts::signal as sig;
#[cfg(unix)]
use signal_hook::iterator::Signals;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Signal {
Terminate,
Child,
}
#[cfg(unix)]
pub struct SignalHandlers {
inner: Signals,
}
#[cfg(unix)]
impl SignalHandlers {
pub fn install() -> std::io::Result<Self> {
let inner = Signals::new([sig::SIGTERM, sig::SIGHUP, sig::SIGCHLD])?;
Ok(Self { inner })
}
pub fn drain(&mut self) -> Vec<Signal> {
let mut out = Vec::new();
for s in self.inner.pending() {
if s == sig::SIGTERM || s == sig::SIGHUP {
out.push(Signal::Terminate);
} else if s == sig::SIGCHLD {
out.push(Signal::Child);
}
}
out
}
}
#[cfg(not(unix))]
pub struct SignalHandlers;
#[cfg(not(unix))]
impl SignalHandlers {
pub fn install() -> std::io::Result<Self> {
Ok(Self)
}
pub fn drain(&mut self) -> Vec<Signal> {
Vec::new()
}
}