1#![cfg_attr(not(feature = "rt"), allow(dead_code))]
2
3//! Process driver.
4
5use crate::process::unix::GlobalOrphanQueue;
6use crate::runtime::driver;
7use crate::runtime::signal::{Driver as SignalDriver, Handle as SignalHandle};
8
9use std::time::Duration;
10
11/// Responsible for cleaning up orphaned child processes on Unix platforms.
12#[derive(Debug)]
13pub(crate) struct Driver {
14 park: SignalDriver,
15 signal_handle: SignalHandle,
16}
17
18// ===== impl Driver =====
19
20impl Driver {
21 /// Creates a new signal `Driver` instance that delegates wakeups to `park`.
22 pub(crate) fn new(park: SignalDriver) -> Self {
23 let signal_handle = park.handle();
24
25 Self {
26 park,
27 signal_handle,
28 }
29 }
30
31 pub(crate) fn park(&mut self, handle: &driver::Handle) {
32 self.park.park(handle);
33 GlobalOrphanQueue::reap_orphans(&self.signal_handle);
34 }
35
36 pub(crate) fn park_timeout(&mut self, handle: &driver::Handle, duration: Duration) {
37 self.park.park_timeout(handle, duration);
38 GlobalOrphanQueue::reap_orphans(&self.signal_handle);
39 }
40
41 pub(crate) fn shutdown(&mut self, handle: &driver::Handle) {
42 self.park.shutdown(handle);
43 }
44}
45