diff options
author | syn <isaqtm@gmail.com> | 2020-01-14 23:06:24 +0300 |
---|---|---|
committer | syn <isaqtm@gmail.com> | 2020-01-14 23:06:24 +0300 |
commit | e6e6285d4faca3795de4250b4ca07fc1d57b849b (patch) | |
tree | 247abe123c6e6a8de8eab6284aba09d41b0fa8fd /src | |
parent | c6481661571e00e264beeb9a21ae916792a4d3be (diff) | |
download | evr-e6e6285d4faca3795de4250b4ca07fc1d57b849b.tar.gz |
Add timeout feature
Diffstat (limited to 'src')
-rw-r--r-- | src/backends/python.rs | 32 |
1 files changed, 25 insertions, 7 deletions
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 |