use std::sync::atomic::{AtomicU32, Ordering};
pub const WATCHDOG_MS: u32 = 2_000;
static OVERRIDE_MS: AtomicU32 = AtomicU32::new(0);
#[must_use]
pub fn watchdog_ms() -> u32 {
match OVERRIDE_MS.load(Ordering::Relaxed) {
0 => environment_watchdog_ms().unwrap_or(WATCHDOG_MS),
set => set,
}
}
#[cfg(not(target_arch = "wasm32"))]
fn environment_watchdog_ms() -> Option<u32> {
std::env::var("ALPHA2_GPU_WATCHDOG_MS")
.ok()?
.trim()
.parse::<u32>()
.ok()
.filter(|value| *value > 0)
}
#[cfg(target_arch = "wasm32")]
const fn environment_watchdog_ms() -> Option<u32> {
None
}
pub fn set_watchdog_ms(value: u32) {
OVERRIDE_MS.store(value, Ordering::Relaxed);
}
#[must_use]
pub fn hung_threshold_ms() -> u32 {
watchdog_ms() / 2
}
#[must_use]
pub fn submission_budget_ms() -> u32 {
watchdog_ms() / 8
}
#[cfg(test)]
mod tests {
#[test]
fn the_threshold_and_budget_are_fractions_of_the_watchdog() {
super::set_watchdog_ms(4_000);
assert_eq!(super::watchdog_ms(), 4_000);
assert_eq!(super::hung_threshold_ms(), 2_000);
assert_eq!(super::submission_budget_ms(), 500);
super::set_watchdog_ms(0);
assert!(super::watchdog_ms() > 0);
}
}