From e6e6285d4faca3795de4250b4ca07fc1d57b849b Mon Sep 17 00:00:00 2001 From: syn Date: Tue, 14 Jan 2020 23:06:24 +0300 Subject: Add timeout feature --- src/backends/python.rs | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/backends/python.rs b/src/backends/python.rs index 2f37ae6..39827a7 100644 --- a/src/backends/python.rs +++ b/src/backends/python.rs @@ -54,13 +54,31 @@ impl Backend for PythonBackend { .stdin(stdio) .spawn()?; - let status = child.wait()?; - if !status.success() { - return Err(Error::new(ErrorKind::Other, - "Process exited with non-zero exit code")); + 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) => { + trace!("elapsed: {:#?}", timer.elapsed()); + if !status.success() { + return Err(Error::new(ErrorKind::Other, + "process exited with non-zero exit code")); + } + Ok(()) + }, + None => { + warn!("timed out: {:#?}", timer.elapsed()); + child.kill()?; + child.wait()?; + Err(Error::new(ErrorKind::TimedOut, + "process timed out")) + } + }, + Err(err) => { + error!("could not wait for child: {}", err); + child.kill()?; + child.wait()?; // Wait defunct + Err(err) + } } - trace!("elapsed: {:#?}", timer.elapsed()); - - Ok(()) } } \ No newline at end of file -- cgit v1.2.1-18-gbd029