use serde::{Deserialize, Serialize};
use crate::util::strsignal;
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct ResourceUsage {
pub memory_usage: u64,
pub user_cpu_time: f64,
pub system_cpu_time: f64,
pub wall_time_usage: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub enum ExitStatus {
ExitCode(i32),
Signal(i32),
Killed,
}
impl ExitStatus {
pub fn success(self) -> bool {
self == ExitStatus::ExitCode(0)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SandboxExecutionResult {
pub status: ExitStatus,
pub resource_usage: ResourceUsage,
}
impl ExitStatus {
pub fn signal_name(&self) -> Option<String> {
match self {
ExitStatus::Signal(signal) => strsignal(*signal),
_ => None,
}
}
}
#[cfg(all(test, unix))]
mod tests {
use super::*;
#[test]
fn test_signal_name() {
#[cfg(target_os = "linux")]
assert_eq!(
Some("Segmentation fault".into()),
ExitStatus::Signal(11).signal_name()
);
#[cfg(target_os = "macos")]
assert_eq!(
Some("Segmentation fault: 11".into()),
ExitStatus::Signal(11).signal_name()
);
assert!(ExitStatus::Killed.signal_name().is_none());
assert!(ExitStatus::ExitCode(0).signal_name().is_none());
}
}