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}