timer_utils/
lib.rs

1use std::time::{Duration, SystemTime, UNIX_EPOCH};
2
3const NANOS_PER_SEC: u64 = 1_000_000_000;
4
5// get the current wall clock in ns
6#[inline]
7pub fn now() -> u64 {
8    SystemTime::now()
9        .duration_since(UNIX_EPOCH)
10        .expect("1970-01-01 00:00:00 UTC was {} seconds ago!")
11        .as_nanos() as u64
12}
13
14#[inline]
15pub fn dur_to_ns(dur: Duration) -> u64 {
16    // Note that a duration is a (u64, u32) (seconds, nanoseconds) pair
17    dur.as_secs()
18        .saturating_mul(NANOS_PER_SEC)
19        .saturating_add(u64::from(dur.subsec_nanos()))
20}
21
22pub fn get_timeout_time(dur: Duration) -> u64 {
23    add_timeout_time(dur_to_ns(dur))
24}
25
26pub fn add_timeout_time(time: u64) -> u64 {
27    let now = now();
28    match now.checked_add(time) {
29        Some(time) => time,
30        //处理溢出
31        None => u64::MAX,
32    }
33}
34
35mod generic;
36
37pub use generic::*;
38
39mod typed;
40
41pub use typed::*;
42
43#[cfg(test)]
44mod tests {
45    use crate::now;
46
47    #[test]
48    fn test() {
49        println!("{}", now());
50    }
51}