underhill_core/
reference_time.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Definitions for Microsoft Hypervisor reference time.
5
6use inspect::Inspect;
7use std::time::Duration;
8
9/// A hypervisor reference time value. This is a 64-bit value that starts at 0
10/// when the VM boots (typically) and measures elapsed time in 100ns units.
11///
12/// It may stop while the VM is paused.
13#[derive(Copy, Clone, Debug, Inspect)]
14#[inspect(transparent(hex))]
15pub struct ReferenceTime(u64);
16
17impl ReferenceTime {
18    /// Wraps a reference time value.
19    pub fn new(value_100ns: u64) -> Self {
20        Self(value_100ns)
21    }
22
23    /// Returns the reference time in 100ns units.
24    pub fn as_100ns(&self) -> u64 {
25        self.0
26    }
27
28    /// Computes the change in reference time since `start`.
29    ///
30    /// Returns `None` if `start` is after `self`.
31    pub fn since(&self, start: ReferenceTime) -> Option<Duration> {
32        let diff_100ns = self.0.wrapping_sub(start.0);
33        if (diff_100ns as i64) < 0 {
34            return None;
35        }
36        // Can't just use from_nanos since that could overflow.
37        let count_per_sec = 10 * 1000 * 1000;
38        Some(Duration::new(
39            diff_100ns / count_per_sec,
40            (diff_100ns % count_per_sec) as u32 * 100,
41        ))
42    }
43}