use crate::*;
use std::mem;
use std::os::windows::io::AsRawHandle;
use std::time::Duration;
use std::{io, process::Child};
use winapi::um::processthreadsapi::GetProcessTimes;
use winapi::um::psapi::GetProcessMemoryInfo;
use winapi::um::psapi::PROCESS_MEMORY_COUNTERS;
use winapi::um::winnt::HANDLE;
impl Wait4 for Child {
fn wait4(&mut self) -> io::Result<ResUse> {
let handle = self.as_raw_handle();
let status = self.wait()?;
let (utime_nsec, stime_nsec) = unsafe {
let mut _ctime = mem::zeroed();
let mut _etime = mem::zeroed();
let mut kernel_time = mem::zeroed();
let mut user_time = mem::zeroed();
let res = GetProcessTimes(
handle as HANDLE,
&mut _ctime,
&mut _etime,
&mut kernel_time,
&mut user_time,
);
if res != 0 {
let user = (((user_time.dwHighDateTime as i64) << 32)
+ user_time.dwLowDateTime as i64)
* 100;
let kernel = (((kernel_time.dwHighDateTime as i64) << 32)
+ kernel_time.dwLowDateTime as i64)
* 100;
(user as u64, kernel as u64)
} else {
(0, 0)
}
};
let maxrss = unsafe {
let mut pmc = mem::zeroed();
let res = GetProcessMemoryInfo(
handle as HANDLE,
&mut pmc,
std::mem::size_of::<PROCESS_MEMORY_COUNTERS>() as u32,
);
if res != 0 {
pmc.PeakWorkingSetSize as u64
} else {
0
}
};
Ok(ResUse {
status,
rusage: ResourceUsage {
utime: Duration::from_nanos(utime_nsec),
stime: Duration::from_nanos(stime_nsec),
maxrss,
},
})
}
}