(process: ProcSelector)
| 360 | #[cfg(feature = "alloc")] |
| 361 | #[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] |
| 362 | pub fn get_reaper_pids(process: ProcSelector) -> io::Result<Vec<PidInfo>> { |
| 363 | // Sadly no better way to guarantee that we get all the results than to |
| 364 | // allocate ≈8MB of memory… |
| 365 | const PID_MAX: usize = 99999; |
| 366 | let mut pids: Vec<procctl_reaper_pidinfo> = vec![Default::default(); PID_MAX]; |
| 367 | let mut pinfo = procctl_reaper_pids { |
| 368 | rp_count: PID_MAX as _, |
| 369 | rp_pad0: [0; 15], |
| 370 | rp_pids: pids.as_mut_slice().as_mut_ptr(), |
| 371 | }; |
| 372 | unsafe { procctl(PROC_REAP_GETPIDS, process, as_mut_ptr(&mut pinfo).cast())? }; |
| 373 | let mut result = Vec::new(); |
| 374 | for raw in pids.into_iter() { |
| 375 | let flags = PidInfoFlags::from_bits_retain(raw.pi_flags); |
| 376 | if !flags.contains(PidInfoFlags::VALID) { |
| 377 | break; |
| 378 | } |
| 379 | result.push(PidInfo { |
| 380 | flags, |
| 381 | subtree: Pid::from_raw(raw.pi_subtree).ok_or(io::Errno::RANGE)?, |
| 382 | pid: Pid::from_raw(raw.pi_pid).ok_or(io::Errno::RANGE)?, |
| 383 | }); |
| 384 | } |
| 385 | Ok(result) |
| 386 | } |
| 387 | |
| 388 | const PROC_REAP_KILL: c_int = 6; |
| 389 |
nothing calls this directly
no test coverage detected