fn waitid_w_nohang_kill_nohang_nowait_wait()

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);
                }
            }
        }
    }