use nix::libc::c_int;
use nix::poll;
use std::cmp;
use std::convert::TryFrom;
use std::io::{Error, ErrorKind, Result};
use std::os::fd::AsFd;
use std::slice;
use std::time::Duration;
pub fn duration_to_ms(duration: Duration) -> c_int {
let secs = cmp::min(duration.as_secs(), c_int::MAX as u64) as c_int;
let nanos = duration.subsec_nanos() as c_int;
secs.saturating_mul(1_000).saturating_add(nanos / 1_000_000)
}
pub fn wait_until_ready(
timeout: Option<c_int>,
fd: &impl AsFd,
events: poll::PollFlags,
) -> Result<()> {
if let Some(timeout) = timeout {
let mut pfd = poll::PollFd::new(fd.as_fd(), events);
let s = slice::from_mut(&mut pfd);
let timeout =
poll::PollTimeout::try_from(timeout).map_err(|e| Error::new(ErrorKind::Other, e))?;
let retval = poll::poll(s, timeout).map_err(|e| Error::new(ErrorKind::Other, e))?;
if retval == 0 {
return Err(Error::new(
ErrorKind::TimedOut,
"timed out waiting for fd to be ready",
));
}
}
Ok(())
}