blob: 5ffe8fa5a7561395748e8d302f15f3145c081006 [file] [log] [blame]
use std;
use std::io;
use std::process::Child;
// A handle on Unix is just the PID.
pub struct Handle(u32);
pub fn get_handle(child: &Child) -> Handle {
Handle(child.id())
}
// This blocks until a child exits, without reaping the child.
pub fn wait_without_reaping(handle: Handle) -> io::Result<()> {
loop {
let ret = unsafe {
let mut siginfo = std::mem::zeroed();
libc::waitid(
libc::P_PID,
handle.0 as libc::id_t,
&mut siginfo,
libc::WEXITED | libc::WNOWAIT,
)
};
if ret == 0 {
return Ok(());
}
let error = io::Error::last_os_error();
if error.kind() != io::ErrorKind::Interrupted {
return Err(error);
}
// We were interrupted. Loop and retry.
}
}