use crate::cancellation::Cancellation;
pub async fn wait_for_shutdown(cancellation: Cancellation) {
wait_for_first_signal().await;
cancellation.cancel();
tokio::signal::ctrl_c()
.await
.expect("failed to listen for SIGINT");
std::process::exit(130);
}
#[cfg(unix)]
async fn wait_for_first_signal() {
use tokio::signal::unix::SignalKind;
let mut sigterm =
tokio::signal::unix::signal(SignalKind::terminate()).expect("failed to listen for SIGTERM");
tokio::select! {
result = tokio::signal::ctrl_c() => {
result.expect("failed to listen for SIGINT");
}
_ = sigterm.recv() => {}
}
}
#[cfg(not(unix))]
async fn wait_for_first_signal() {
tokio::signal::ctrl_c()
.await
.expect("failed to listen for SIGINT");
}