From 30e1e3a13dc19c47afc517d1178e1dbf5b401596 Mon Sep 17 00:00:00 2001 From: syn Date: Sun, 9 Feb 2020 19:17:57 +0300 Subject: timeout'ed waiter for process --- src/backends/python.rs | 34 ++++++---------------------------- 1 file changed, 6 insertions(+), 28 deletions(-) (limited to 'src/backends/python.rs') 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 { - let timer = std::time::SystemTime::now(); + fn run(&self, fname: &Path) -> Result { + 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 -- cgit v1.2.1-18-gbd029