use crate::{
Duration, LINUX_ERRNO as ERRNO, LINUX_EXIT, Linux, LinuxClock, LinuxError,
LinuxResult as Result, LinuxTimespec, c_int, is,
};
impl Linux {
pub fn clock_getres(clock_id: LinuxClock) -> Result<LinuxTimespec> {
let mut res = LinuxTimespec::default();
let ret = unsafe { Self::sys_clock_getres(clock_id, res.as_mut_ptr()) };
if ret == 0 { Ok(res) } else { Err(LinuxError::Sys(ret)) }
}
pub fn clock_gettime(clock_id: LinuxClock) -> Result<LinuxTimespec> {
let mut tp = LinuxTimespec::default();
let ret = unsafe { Self::sys_clock_gettime(clock_id, tp.as_mut_ptr()) };
is![ret == 0, Ok(tp), Err(LinuxError::Sys(ret))]
}
pub fn sleep(duration: Duration) -> Result<()> {
let mut req = LinuxTimespec::with_saturating_duration(duration);
let mut rem = LinuxTimespec::default();
loop {
let n = unsafe { Linux::sys_nanosleep(req.as_ptr(), rem.as_mut_ptr()) };
if n == 0 {
break Ok(()); } else if n == -ERRNO::EINTR {
req = rem; continue;
} else {
return Err(LinuxError::Sys(n));
}
}
}
pub fn sleep_ms(milliseconds: u64) -> Result<()> {
Linux::sleep(Duration::from_millis(milliseconds))
}
#[must_use]
#[inline(always)]
pub fn getpid() -> c_int {
unsafe { Linux::sys_getpid() }
}
#[inline(always)]
pub fn exit(status: c_int) -> ! {
unsafe {
Linux::sys_exit(status & LINUX_EXIT::MAX);
}
}
}