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")]
use crate::sys::ProcMetrics;
pub(crate) struct Job;
impl Job {
pub(crate) fn new(#[cfg(feature = "limits")] limits: &ResourceLimits) -> io::Result<Self> {
#[cfg(feature = "limits")]
if limits.any() {
return Err(io::Error::new(
io::ErrorKind::Unsupported,
"resource limits require a cgroup or Job Object; unavailable on this target",
));
}
Ok(Job)
}
pub(crate) fn spawn(
&self,
cmd: &mut Command,
_opts: &crate::sys::SpawnOptions,
) -> io::Result<Child> {
cmd.spawn()
}
#[cfg(feature = "process-control")]
pub(crate) fn adopt(&self, _child: &Child) -> io::Result<()> {
Ok(())
}
pub(crate) fn kill_all(&self) -> io::Result<()> {
Ok(())
}
#[cfg(feature = "process-control")]
pub(crate) fn signal(&self, sig: Signal) -> io::Result<()> {
Err(io::Error::new(
io::ErrorKind::Unsupported,
format!("signal({sig:?})"),
))
}
#[cfg(feature = "process-control")]
pub(crate) fn suspend(&self) -> io::Result<()> {
Err(io::Error::new(io::ErrorKind::Unsupported, "suspend"))
}
#[cfg(feature = "process-control")]
pub(crate) fn resume(&self) -> io::Result<()> {
Err(io::Error::new(io::ErrorKind::Unsupported, "resume"))
}
#[cfg(feature = "process-control")]
pub(crate) fn members(&self) -> io::Result<Vec<u32>> {
Ok(Vec::new())
}
pub(crate) async fn graceful_shutdown(
&self,
_timeout: Duration,
_escalate: bool,
) -> io::Result<()> {
Ok(())
}
#[cfg(feature = "stats")]
pub(crate) fn stats(&self) -> io::Result<ProcessGroupStats> {
Ok(ProcessGroupStats {
active_process_count: 0,
total_cpu_time: None,
peak_memory_bytes: None,
})
}
pub(crate) fn mechanism(&self) -> Mechanism {
Mechanism::None
}
}
#[cfg(feature = "stats")]
pub(crate) fn process_metrics(_pid: u32) -> ProcMetrics {
ProcMetrics::default()
}