use tokio_util::sync::CancellationToken;
#[cfg(windows)]
use tracing::trace;
#[cfg(unix)]
use tracing::{trace, warn};
#[inline]
#[cfg(unix)]
#[expect(clippy::unwrap_used)]
async fn wait_for_exit_signal() {
let mut sigterm = tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()).unwrap();
tokio::select! {
_ = tokio::signal::ctrl_c() => {
warn!("SIGINT detected");
}
_ = sigterm.recv() => {
warn!("SIGTERM detected");
}
};
}
#[inline]
#[cfg(windows)]
async fn wait_for_exit_signal() {
tokio::signal::ctrl_c().await.unwrap()
}
pub fn hook_exit_token() -> CancellationToken {
let cancel = CancellationToken::new();
let cancel2 = cancel.clone();
tokio::spawn(async move {
wait_for_exit_signal().await;
trace!("notifying exit");
cancel2.cancel();
});
cancel
}