use std::io;
use std::mem::MaybeUninit;
use std::time::Duration;
pub struct Rusage(libc::rusage);
impl Rusage {
pub fn get_self() -> io::Result<Self> {
unsafe {
let mut rusage = MaybeUninit::uninit();
if libc::getrusage(libc::RUSAGE_SELF, rusage.as_mut_ptr()) != 0 {
return Err(io::Error::last_os_error());
}
Ok(Rusage(rusage.assume_init()))
}
}
pub fn user_time(&self) -> Duration {
Duration::new(
self.0.ru_utime.tv_sec as u64,
self.0.ru_utime.tv_usec as u32 * 1000,
)
}
pub fn system_time(&self) -> Duration {
Duration::new(
self.0.ru_stime.tv_sec as u64,
self.0.ru_stime.tv_usec as u32 * 1000,
)
}
pub fn blocks_read(&self) -> u64 {
self.0.ru_inblock as u64
}
pub fn blocks_written(&self) -> u64 {
self.0.ru_oublock as u64
}
}