#[cfg(unix)]
pub use unix::{notify_ready, spawn_watchdog};
#[cfg(not(unix))]
pub use stub::{notify_ready, spawn_watchdog};
#[cfg(unix)]
mod unix {
use std::time::Duration;
use tracing::{info, warn};
pub fn notify_ready() {
if let Err(e) = sd_notify::notify(&[sd_notify::NotifyState::Ready]) {
warn!("sd-notify ready signal failed: {}", e);
}
}
pub fn spawn_watchdog() {
let Some(interval) = watchdog_interval() else {
return;
};
info!("Watchdog enabled; sending heartbeats every {:?}", interval);
tokio::spawn(async move {
let mut ticker = tokio::time::interval(interval);
loop {
ticker.tick().await;
if let Err(e) = sd_notify::notify(&[sd_notify::NotifyState::Watchdog]) {
warn!("sd-notify watchdog heartbeat failed: {}", e);
}
}
});
}
fn watchdog_interval() -> Option<Duration> {
sd_notify::watchdog_enabled().map(|timeout| timeout / 2)
}
}
#[cfg(not(unix))]
mod stub {
pub fn notify_ready() {}
pub fn spawn_watchdog() {}
}