use tracing::warn;
use crate::RuntimeError;
use crate::RuntimeResult;
pub async fn wait_for_signal() {
if let Err(error) = wait_for_signal_result().await {
warn!(error = %error, "Failed to wait for the process termination signal");
}
}
#[cfg(unix)]
pub async fn wait_for_signal_result() -> RuntimeResult<()> {
use tokio::signal::unix::signal;
use tokio::signal::unix::SignalKind;
use tracing::info;
let mut term = signal(SignalKind::terminate())
.map_err(|error| RuntimeError::internal(crate::RuntimeOperation::RegisterSigtermHandler, error))?;
let mut int = signal(SignalKind::interrupt())
.map_err(|error| RuntimeError::internal(crate::RuntimeOperation::RegisterSigintHandler, error))?;
tokio::select! {
_ = term.recv() => info!("Received SIGTERM"),
_ = int.recv() => info!("Received SIGINT"),
}
Ok(())
}
#[cfg(windows)]
pub async fn wait_for_signal_result() -> RuntimeResult<()> {
tokio::signal::ctrl_c()
.await
.map_err(|error| RuntimeError::internal(crate::RuntimeOperation::WaitForSignal, error))
}