From 70045e2544744fc82f9b678ef3038bc8f169136c Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 24 Jun 2026 11:55:47 +0300 Subject: [PATCH] =?UTF-8?q?feat(common):=20=D0=BC=D0=BE=D0=BD=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=87=D0=B0=D1=81=D1=8B=20(B?= =?UTF-8?q?=20=C2=A78)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- crates/shturman-common/src/clock.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) 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, "монотонные секунды не должны идти назад"); + } +}