summaryrefslogtreecommitdiffstats
path: root/src/wait/rusage_ffi.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/wait/rusage_ffi.rs')
-rw-r--r--src/wait/rusage_ffi.rs53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/wait/rusage_ffi.rs b/src/wait/rusage_ffi.rs
new file mode 100644
index 0000000..5948958
--- /dev/null
+++ b/src/wait/rusage_ffi.rs
@@ -0,0 +1,53 @@
+use nix::libc;
+use std::time::Duration;
+
+#[derive(Debug)]
+pub struct Rusage {
+ pub ru_utime: Duration,
+ pub ru_stime: Duration,
+ pub ru_maxrss: i64,
+ pub ru_ixrss: i64,
+ pub ru_idrss: i64,
+ pub ru_isrss: i64,
+ pub ru_minflt: i64,
+ pub ru_majflt: i64,
+ pub ru_nswap: i64,
+ pub ru_inblock: i64,
+ pub ru_oublock: i64,
+ pub ru_msgsnd: i64,
+ pub ru_msgrcv: i64,
+ pub ru_nsignals: i64,
+ pub ru_nvcsw: i64,
+ pub ru_nivcsw: i64,
+}
+
+impl From<libc::rusage> for Rusage {
+ fn from(usg: libc::rusage) -> Rusage {
+ const MICROS_IN_SEC: u64 = 1_000_000;
+ let convert_timeval = |tv: libc::timeval| {
+ Duration::from_micros(
+ tv.tv_sec as u64 * MICROS_IN_SEC +
+ tv.tv_usec as u64
+ )
+ };
+
+ Rusage {
+ ru_utime: convert_timeval(usg.ru_utime),
+ ru_stime: convert_timeval(usg.ru_stime),
+ ru_maxrss: usg.ru_maxrss,
+ ru_ixrss: usg.ru_ixrss,
+ ru_idrss: usg.ru_idrss,
+ ru_isrss: usg.ru_isrss,
+ ru_minflt: usg.ru_minflt,
+ ru_majflt: usg.ru_majflt,
+ ru_nswap: usg.ru_nswap,
+ ru_inblock: usg.ru_inblock,
+ ru_oublock: usg.ru_oublock,
+ ru_msgsnd: usg.ru_msgsnd,
+ ru_msgrcv: usg.ru_msgrcv,
+ ru_nsignals: usg.ru_nsignals,
+ ru_nvcsw: usg.ru_nvcsw,
+ ru_nivcsw: usg.ru_nivcsw,
+ }
+ }
+}