#![cfg(unix)]
use std::process::{Child, ExitStatus};
use std::time::{Duration, Instant};
pub fn wait_bounded(child: &mut Child, timeout: Duration, what: &str) -> ExitStatus {
let deadline = Instant::now() + timeout;
loop {
if let Some(status) = child
.try_wait()
.unwrap_or_else(|error| panic!("poll {what}: {error}"))
{
return status;
}
if Instant::now() >= deadline {
let _ = child.kill();
let _ = child.wait();
panic!("{what} did not exit within {timeout:?}");
}
std::thread::sleep(Duration::from_millis(20));
}
}