in reverie-ptrace/src/trace/waitid.rs [294:337]
fn waitid_w_nohang_kill_nohang_nowait_wait() {
let fork_result = unsafe { unistd::fork() };
assert!(fork_result.is_ok());
match fork_result.unwrap() {
ForkResult::Parent { child, .. } => {
assert_eq!(
waitid(
IdType::Pid(child),
WaitPidFlag::WEXITED | WaitPidFlag::WNOHANG
),
Ok(WaitStatus::StillAlive),
);
assert!(nix::sys::signal::kill(child, Signal::SIGINT).is_ok());
loop {
// this is not very ideal, the loops generally runs 1K - 10K times..
let status = waitid(
IdType::Pid(child),
WaitPidFlag::WEXITED | WaitPidFlag::WNOHANG | WaitPidFlag::WNOWAIT,
);
assert!(status.is_ok());
match status.unwrap() {
WaitStatus::StillAlive => {}
waitid_nohang_nowait => {
assert_eq!(
waitid_nohang_nowait,
WaitStatus::Signaled(child, Signal::SIGINT, false)
);
break;
}
}
}
assert_eq!(
waitid(IdType::Pid(child), WaitPidFlag::WEXITED),
Ok(WaitStatus::Signaled(child, Signal::SIGINT, false))
);
}
ForkResult::Child => {
let one_sec = std::time::Duration::from_millis(100);
loop {
std::thread::sleep(one_sec);
}
}
}
}