use std::io;
use std::time::Duration;
use tokio::process::{Child, Command};
use crate::Mechanism;
#[cfg(feature = "process-control")]
use crate::Signal;
#[cfg(feature = "limits")]
use crate::limits::ResourceLimits;
#[cfg(feature = "stats")]
use crate::stats::ProcessGroupStats;
#[cfg(feature = "stats")]
#[derive(Debug, Clone, Copy, Default)]
pub(crate) struct ProcMetrics {
pub cpu_time: Option<Duration>,
pub peak_memory_bytes: Option<u64>,
}
#[cfg(feature = "stats")]
pub(crate) fn process_metrics(pid: u32) -> ProcMetrics {
imp::process_metrics(pid)
}
#[cfg(unix)]
pub(crate) mod pgroup;
#[derive(Debug, Clone, Copy, Default)]
pub(crate) struct SpawnOptions {
#[cfg_attr(not(unix), allow(dead_code))]
pub setsid: bool,
#[cfg_attr(not(windows), allow(dead_code))]
pub creation_flags: u32,
}
#[cfg_attr(windows, path = "windows.rs")]
#[cfg_attr(target_os = "linux", path = "linux.rs")]
#[cfg_attr(all(unix, not(target_os = "linux")), path = "unix.rs")]
#[cfg_attr(not(any(windows, unix)), path = "other.rs")]
mod imp;
pub(crate) struct Job(imp::Job);
impl Job {
#[cfg(feature = "limits")]
pub(crate) fn new(limits: &ResourceLimits) -> io::Result<Self> {
imp::Job::new(limits).map(Job)
}
#[cfg(not(feature = "limits"))]
pub(crate) fn new() -> io::Result<Self> {
imp::Job::new().map(Job)
}
pub(crate) fn spawn(&self, cmd: &mut Command, opts: &SpawnOptions) -> io::Result<Child> {
self.0.spawn(cmd, opts)
}
#[cfg(feature = "process-control")]
pub(crate) fn adopt(&self, child: &Child) -> io::Result<()> {
self.0.adopt(child)
}
pub(crate) fn kill_all(&self) -> io::Result<()> {
self.0.kill_all()
}
#[cfg(feature = "process-control")]
pub(crate) fn signal(&self, sig: Signal) -> io::Result<()> {
self.0.signal(sig)
}
#[cfg(feature = "process-control")]
pub(crate) fn suspend(&self) -> io::Result<()> {
self.0.suspend()
}
#[cfg(feature = "process-control")]
pub(crate) fn resume(&self) -> io::Result<()> {
self.0.resume()
}
#[cfg(feature = "process-control")]
pub(crate) fn members(&self) -> io::Result<Vec<u32>> {
self.0.members()
}
pub(crate) async fn graceful_shutdown(
&self,
timeout: Duration,
escalate: bool,
) -> io::Result<()> {
self.0.graceful_shutdown(timeout, escalate).await
}
#[cfg(feature = "stats")]
pub(crate) fn stats(&self) -> io::Result<ProcessGroupStats> {
self.0.stats()
}
pub(crate) fn mechanism(&self) -> Mechanism {
self.0.mechanism()
}
}