diff --git a/quic/s2n-quic-core/src/time/clock.rs b/quic/s2n-quic-core/src/time/clock.rs index cf31a46d9b..2ecf3fc03b 100644 --- a/quic/s2n-quic-core/src/time/clock.rs +++ b/quic/s2n-quic-core/src/time/clock.rs @@ -48,3 +48,39 @@ impl Clock for NoopClock { unsafe { Timestamp::from_duration(Duration::from_micros(1)) } } } + +impl Clock for Timestamp { + #[inline] + fn get_time(&self) -> Timestamp { + *self + } +} + +/// A clock that caches the time query for the inner clock +pub struct Cached<'a, C: Clock> { + clock: &'a C, + cached_value: core::cell::Cell>, +} + +impl<'a, C: Clock> Cached<'a, C> { + #[inline] + pub fn new(clock: &'a C) -> Self { + Self { + clock, + cached_value: Default::default(), + } + } +} + +impl<'a, C: Clock> Clock for Cached<'a, C> { + #[inline] + fn get_time(&self) -> Timestamp { + if let Some(time) = self.cached_value.get() { + return time; + } + + let now = self.clock.get_time(); + self.cached_value.set(Some(now)); + now + } +} diff --git a/quic/s2n-quic-core/src/time/timer.rs b/quic/s2n-quic-core/src/time/timer.rs index a244f1632f..f1ea08326f 100644 --- a/quic/s2n-quic-core/src/time/timer.rs +++ b/quic/s2n-quic-core/src/time/timer.rs @@ -215,6 +215,19 @@ impl Result> Query for ForEach { } } +#[cfg(feature = "tracing")] +pub struct Debugger; + +#[cfg(feature = "tracing")] +impl Query for Debugger { + #[inline] + #[track_caller] + fn on_timer(&mut self, timer: &Timer) -> Result { + tracing::trace!(location = %core::panic::Location::caller(), timer = ?timer); + Ok(()) + } +} + #[cfg(test)] mod tests { use super::*;