diff --git a/crates/shturman-common/src/clock.rs b/crates/shturman-common/src/clock.rs index a3ff28c..baee27e 100644 --- a/crates/shturman-common/src/clock.rs +++ b/crates/shturman-common/src/clock.rs @@ -1 +1,25 @@ -//! Монотонные часы — B §8 (наполняется в Task 4). +//! Монотонные часы — B §8: lifecycle-таймеры/`Uptime` идут только вперёд, не прыгают при NTP/GPS-синке. +//! На Linux `Instant` опирается на `CLOCK_MONOTONIC`. + +use std::sync::OnceLock; +use std::time::Instant; + +static EPOCH: OnceLock = OnceLock::new(); + +/// Секунды от первого обращения в процессе (монотонно). Достаточно для стаб-`Uptime` (v0). +pub fn monotonic_secs() -> u64 { + let epoch = *EPOCH.get_or_init(Instant::now); + epoch.elapsed().as_secs() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn non_decreasing() { + let a = monotonic_secs(); + let b = monotonic_secs(); + assert!(b >= a, "монотонные секунды не должны идти назад"); + } +}