diff options
Diffstat (limited to 'src/backends/python.rs')
-rw-r--r-- | src/backends/python.rs | 34 |
1 files changed, 6 insertions, 28 deletions
diff --git a/src/backends/python.rs b/src/backends/python.rs index 66402b9..e3569b1 100644 --- a/src/backends/python.rs +++ b/src/backends/python.rs @@ -1,9 +1,8 @@ use serde_derive::{ Serialize, Deserialize }; -use crate::backends::{ Backend, RunStatus }; +use crate::backends::{ Backend, RunError }; use std::process::{ Command }; use std::path::Path; -use log::error; -use wait_timeout::ChildExt; +use crate::wait::{ wait_child, WaitInfo }; #[derive(Debug, Serialize, Deserialize, Default)] pub struct PythonBackend { @@ -33,35 +32,14 @@ impl Backend for PythonBackend { } } - fn run(&self, fname: &Path) -> std::io::Result<RunStatus> { - let timer = std::time::SystemTime::now(); + fn run(&self, fname: &Path) -> Result<WaitInfo, RunError> { + let timer = std::time::Instant::now(); - let mut child = Command::new(self.get_interpreter()) + let child = Command::new(self.get_interpreter()) .arg(fname.as_os_str()) .spawn()?; let timeout = std::time::Duration::from_secs_f32(self.timeout.unwrap_or(1.0)); - match child.wait_timeout(timeout) { - Ok(maybe_status) => match maybe_status { - Some(status) => { - if !status.success() { - return Ok(RunStatus::ErrorCode(status.code().unwrap_or(0))); - } - Ok(RunStatus::Success) - }, - None => { - let elapsed = timer.elapsed().unwrap_or(Default::default()); - child.kill()?; - child.wait()?; - Ok(RunStatus::TimedOut(elapsed)) - } - }, - Err(err) => { - error!("could not wait for child: {}", err); - child.kill()?; - child.wait()?; // Wait defunct - Err(err) - } - } + Ok(wait_child(child, timeout, timer)?) } }
\ No newline at end of file |