process_control/unix/wait/
waitid.rs

1use std::mem::MaybeUninit;
2use std::time::Duration;
3
4use libc::P_PID;
5use libc::WEXITED;
6use libc::WNOWAIT;
7use libc::WSTOPPED;
8
9use crate::WaitResult;
10
11use super::super::check_syscall;
12use super::super::ExitStatus;
13use super::super::Process;
14
15pub(in super::super) fn wait(
16    process: &mut Process<'_>,
17    time_limit: Option<Duration>,
18) -> WaitResult<ExitStatus> {
19    let pid = process.pid.as_id();
20    super::run_with_time_limit(
21        move || loop {
22            let mut process_info = MaybeUninit::uninit();
23            check_result!(check_syscall(unsafe {
24                libc::waitid(
25                    P_PID,
26                    pid,
27                    process_info.as_mut_ptr(),
28                    WEXITED | WNOWAIT | WSTOPPED,
29                )
30            }));
31            break Ok(unsafe { ExitStatus::new(process_info.assume_init()) });
32        },
33        time_limit,
34    )?
35    .transpose()
36}