1//! Additional utilities for tracking time.
2//!
3//! This module provides additional utilities for executing code after a set period
4//! of time. Currently there is only one:
5//!
6//! * `DelayQueue`: A queue where items are returned once the requested delay
7//! has expired.
8//!
9//! This type must be used from within the context of the `Runtime`.
10
11use std::time::Duration;
12
13mod wheel;
14
15pub mod delay_queue;
16
17#[doc(inline)]
18pub use delay_queue::DelayQueue;
19
20// ===== Internal utils =====
21
22enum Round {
23 Up,
24 Down,
25}
26
27/// Convert a `Duration` to milliseconds, rounding up and saturating at
28/// `u64::MAX`.
29///
30/// The saturating is fine because `u64::MAX` milliseconds are still many
31/// million years.
32#[inline]
33fn ms(duration: Duration, round: Round) -> u64 {
34 const NANOS_PER_MILLI: u32 = 1_000_000;
35 const MILLIS_PER_SEC: u64 = 1_000;
36
37 // Round up.
38 let millis = match round {
39 Round::Up => (duration.subsec_nanos() + NANOS_PER_MILLI - 1) / NANOS_PER_MILLI,
40 Round::Down => duration.subsec_millis(),
41 };
42
43 duration
44 .as_secs()
45 .saturating_mul(MILLIS_PER_SEC)
46 .saturating_add(u64::from(millis))
47}
48