1 use libc::timespec;
2 use std::time::Duration;
3 
4 #[cfg(not(all(target_os = "freebsd", target_arch = "x86")))]
duration_to_timespec(d: Duration) -> timespec5 pub(crate) fn duration_to_timespec(d: Duration) -> timespec {
6     let tv_sec = d.as_secs() as i64;
7     let tv_nsec = d.subsec_nanos() as i64;
8 
9     if tv_sec.is_negative() {
10         panic!("Duration seconds is negative");
11     }
12 
13     if tv_nsec.is_negative() {
14         panic!("Duration nsecs is negative");
15     }
16 
17     timespec { tv_sec, tv_nsec }
18 }
19 
20 #[cfg(all(target_os = "freebsd", target_arch = "x86"))]
duration_to_timespec(d: Duration) -> timespec21 pub(crate) fn duration_to_timespec(d: Duration) -> timespec {
22     let tv_sec = d.as_secs() as i32;
23     let tv_nsec = d.subsec_nanos() as i32;
24 
25     if tv_sec.is_negative() {
26         panic!("Duration seconds is negative");
27     }
28 
29     if tv_nsec.is_negative() {
30         panic!("Duration nsecs is negative");
31     }
32 
33     timespec { tv_sec, tv_nsec }
34 }
35 
36 #[cfg(test)]
37 mod tests {
38     use super::duration_to_timespec;
39     use std::time::Duration;
40     use std::{i64, u32};
41 
42     #[test]
test_basic_duration_to_ts()43     fn test_basic_duration_to_ts() {
44         let d = Duration::new(4, 20);
45 
46         let ts = duration_to_timespec(d);
47 
48         assert_eq!(ts.tv_sec, 4);
49         assert_eq!(ts.tv_nsec, 20);
50     }
51 
52     #[test]
53     #[should_panic]
test_overflow()54     fn test_overflow() {
55         let d = Duration::new(i64::MAX as u64 + 1, u32::MAX);
56         let ts = duration_to_timespec(d);
57 
58         assert_eq!(ts.tv_sec, 1);
59         assert_eq!(ts.tv_nsec, 1);
60     }
61 }
62