use std::sync::atomic::{AtomicBool, Ordering};
static SHUTDOWN_REQUESTED: AtomicBool = AtomicBool::new(false);
pub(crate) fn shutdown_requested() -> bool {
SHUTDOWN_REQUESTED.load(Ordering::Relaxed)
}
#[cfg(unix)]
pub(crate) fn install_sigterm_handler() {
unsafe {
let mut sa: libc::sigaction = std::mem::zeroed();
sa.sa_sigaction = sigterm_handler as *const () as usize;
sa.sa_flags = libc::SA_RESTART;
libc::sigemptyset(&mut sa.sa_mask);
libc::sigaction(libc::SIGTERM, &sa, std::ptr::null_mut());
}
}
#[cfg(unix)]
extern "C" fn sigterm_handler(_sig: libc::c_int) {
SHUTDOWN_REQUESTED.store(true, Ordering::Relaxed);
}
#[cfg(not(unix))]
pub(crate) fn install_sigterm_handler() {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn flag_starts_clear() {
assert!(!shutdown_requested());
}
}