moirai_async/timer/
mod.rs1pub mod delay;
6pub(super) mod driver;
7pub mod interval;
8pub mod limiter;
9pub(super) mod registration;
10pub mod timeout;
11pub mod wheel;
12
13pub use delay::Delay;
14pub use interval::Interval;
15pub use limiter::{RateLimiter, RatePermit};
16pub use timeout::{Timeout, TimeoutError};
17pub use wheel::{TimerCommand, TimerWheel};
18
19use std::future::Future;
20use std::time::{Duration, Instant};
21
22pub(crate) fn clamped_deadline(base: Instant, duration: Duration) -> Instant {
32 const MAX_TIMER: Duration = Duration::from_secs(100 * 365 * 24 * 60 * 60);
33 base.checked_add(duration.min(MAX_TIMER)).unwrap_or(base)
34}
35
36pub fn sleep(duration: Duration) -> Delay {
38 Delay::new(duration)
39}
40
41pub fn timeout<F>(duration: Duration, future: F) -> Timeout<F>
43where
44 F: Future,
45{
46 Timeout::new(future, duration)
47}
48
49pub fn interval(period: Duration) -> Interval {
51 Interval::new(period)
52}
53
54pub fn interval_at(start: Instant, period: Duration) -> Interval {
56 Interval::new_at(start, period)
57}
58
59#[cfg(test)]
60mod tests {
61 use super::*;
62 use std::time::Instant;
63
64 #[test]
65 fn test_delay_basic() {
66 let delay = Delay::new(Duration::from_millis(10));
67 assert!(delay.deadline() > Instant::now());
68 }
69
70 #[test]
71 fn test_sleep_function() {
72 let timer = sleep(Duration::from_millis(10));
73 assert!(timer.deadline() > Instant::now());
74 }
75
76 fn one_year_from_now() -> Instant {
79 Instant::now() + Duration::from_secs(365 * 24 * 60 * 60)
80 }
81
82 #[test]
83 fn delay_extreme_duration_does_not_panic() {
84 let delay = Delay::new(Duration::MAX);
88 assert!(delay.deadline() > one_year_from_now());
89 }
90
91 #[test]
92 fn delay_reset_extreme_duration_does_not_panic() {
93 let mut delay = Delay::new(Duration::from_millis(1));
94 delay.reset(Duration::MAX);
95 assert!(delay.deadline() > one_year_from_now());
96 }
97
98 #[test]
99 fn interval_extreme_period_does_not_panic() {
100 let timer = interval(Duration::MAX);
101 assert!(timer.next_tick() > one_year_from_now());
102
103 let mut timer = interval(Duration::from_millis(1));
104 timer.set_period(Duration::MAX);
105 assert!(timer.next_tick() > one_year_from_now());
106 }
107}