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