process_control/unix/wait/
waitid.rs1use 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}