blob: d6efcf78f03d672ae8356018e1a9ec73e3139fb2 [file] [log] [blame]
use libc::{c_long, time_t, timespec};
use std::time::Duration;
#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
type NSec = i64;
#[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
type NSec = c_long;
pub(crate) fn duration_to_timespec(d: Duration) -> timespec {
let tv_sec = d.as_secs() as time_t;
let tv_nsec = d.subsec_nanos() as NSec;
if tv_sec.is_negative() {
panic!("Duration seconds is negative");
}
if tv_nsec.is_negative() {
panic!("Duration nsecs is negative");
}
timespec { tv_sec, tv_nsec }
}
#[cfg(test)]
mod tests {
use super::duration_to_timespec;
use std::time::Duration;
use std::{i64, u32};
#[test]
fn test_basic_duration_to_ts() {
let d = Duration::new(4, 20);
let ts = duration_to_timespec(d);
assert_eq!(ts.tv_sec, 4);
assert_eq!(ts.tv_nsec, 20);
}
#[test]
#[should_panic]
fn test_overflow() {
let d = Duration::new(i64::MAX as u64 + 1, u32::MAX);
let ts = duration_to_timespec(d);
assert_eq!(ts.tv_sec, 1);
assert_eq!(ts.tv_nsec, 1);
}
}