pub(crate) async fn signal() {
#[cfg(unix)]
unix_signal().await;
#[cfg(not(unix))]
wait_ctrl_c().await;
}
#[cfg(unix)]
async fn unix_signal() {
let mut sigterm = match tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())
{
Ok(signal) => signal,
Err(error) => {
tracing::error!(%error, "failed to install SIGTERM handler");
wait_ctrl_c().await;
return;
}
};
tokio::select! {
() = wait_ctrl_c() => {}
_ = sigterm.recv() => {}
}
}
async fn wait_ctrl_c() {
if let Err(error) = tokio::signal::ctrl_c().await {
tracing::error!(%error, "CTRL+C handler failed");
}
}