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 | |
11 | use std::time::Duration; |
12 | |
13 | mod wheel; |
14 | |
15 | pub mod delay_queue; |
16 | |
17 | #[doc (inline)] |
18 | pub use delay_queue::DelayQueue; |
19 | |
20 | // ===== Internal utils ===== |
21 | |
22 | enum 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 ] |
33 | fn 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 | |