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