use tokio::signal;
pub async fn shutdown_signal() {
let ctrl_c = async {
if let Err(e) = signal::ctrl_c().await {
tracing::warn!("failed to install Ctrl-C handler: {e}");
}
};
#[cfg(unix)]
let terminate = async {
match signal::unix::signal(signal::unix::SignalKind::terminate()) {
Ok(mut sig) => {
sig.recv().await;
}
Err(e) => {
tracing::warn!("failed to install SIGTERM handler: {e}");
std::future::pending::<()>().await;
}
}
};
#[cfg(not(unix))]
let terminate = std::future::pending::<()>();
tokio::select! {
() = ctrl_c => {}
() = terminate => {}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn shutdown_signal_can_race_against_timer() {
let result =
tokio::time::timeout(std::time::Duration::from_millis(50), shutdown_signal()).await;
assert!(
result.is_err(),
"shutdown_signal should not complete in 50ms"
);
}
}