#![cfg_attr(not(feature = "rt"), allow(dead_code))] //! Process driver use crate::park::Park; use crate::process::unix::GlobalOrphanQueue; use crate::signal::unix::driver::{Driver as SignalDriver, Handle as SignalHandle}; use std::io; use std::time::Duration; /// Responsible for cleaning up orphaned child processes on Unix platforms. #[derive(Debug)] pub(crate) struct Driver { park: SignalDriver, signal_handle: SignalHandle, } // ===== impl Driver ===== impl Driver { /// Creates a new signal `Driver` instance that delegates wakeups to `park`. pub(crate) fn new(park: SignalDriver) -> Self { let signal_handle = park.handle(); Self { park, signal_handle, } } } // ===== impl Park for Driver ===== impl Park for Driver { type Unpark = ::Unpark; type Error = io::Error; fn unpark(&self) -> Self::Unpark { self.park.unpark() } fn park(&mut self) -> Result<(), Self::Error> { self.park.park()?; GlobalOrphanQueue::reap_orphans(&self.signal_handle); Ok(()) } fn park_timeout(&mut self, duration: Duration) -> Result<(), Self::Error> { self.park.park_timeout(duration)?; GlobalOrphanQueue::reap_orphans(&self.signal_handle); Ok(()) } fn shutdown(&mut self) { self.park.shutdown() } }