timeout_trait/
delay.rs

1use crate::*;
2use core::marker::PhantomData;
3
4/// [`DelayNs`] implementation
5pub struct TickDelay<T> {
6    _t: PhantomData<T>,
7}
8
9impl<T> Default for TickDelay<T>
10where
11    T: TickInstant,
12{
13    fn default() -> Self {
14        Self { _t: PhantomData }
15    }
16}
17
18impl<T> DelayNs for TickDelay<T>
19where
20    T: TickInstant,
21{
22    #[inline]
23    fn delay_ns(&mut self, ns: u32) {
24        let mut t = T::now();
25        let dur = TickDuration::<T>::nanos(ns);
26        while !t.timeout(&dur) {
27            // For unit test
28            #[cfg(feature = "std")]
29            std::thread::sleep(std::time::Duration::from_nanos(1));
30        }
31    }
32}
33
34#[cfg(feature = "std")]
35pub use for_std::*;
36#[cfg(feature = "std")]
37mod for_std {
38    use super::*;
39    use std::time::Duration;
40
41    #[derive(Default)]
42    pub struct StdDelayNs {}
43
44    impl DelayNs for StdDelayNs {
45        #[inline]
46        fn delay_ns(&mut self, ns: u32) {
47            std::thread::sleep(Duration::from_nanos(ns.into()))
48        }
49    }
50
51    #[cfg(test)]
52    mod tests {
53        use super::*;
54        use crate::std_impls::StdTickInstant;
55        use std::time::{Duration, Instant};
56
57        fn test_delay(mut d: impl DelayNs) {
58            let t = Instant::now();
59            d.delay_ns(200_000_000);
60            let elapsed = t.elapsed();
61            assert!(elapsed - Duration::from_millis(200) < Duration::from_millis(100));
62
63            let t = Instant::now();
64            d.delay_us(200_000);
65            let elapsed = t.elapsed();
66            assert!(elapsed - Duration::from_millis(200) < Duration::from_millis(100));
67
68            let t = Instant::now();
69            d.delay_ms(500);
70            let elapsed = t.elapsed();
71            assert!(elapsed - Duration::from_millis(500) < Duration::from_millis(100));
72        }
73
74        #[test]
75        fn std_delay() {
76            let d = StdDelayNs::default();
77            test_delay(d);
78        }
79
80        #[test]
81        fn tick_delay() {
82            let d = TickDelay::<StdTickInstant>::default();
83            test_delay(d);
84        }
85    }
86}