summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorsyn <isaqtm@gmail.com>2020-01-14 23:06:24 +0300
committersyn <isaqtm@gmail.com>2020-01-14 23:06:24 +0300
commite6e6285d4faca3795de4250b4ca07fc1d57b849b (patch)
tree247abe123c6e6a8de8eab6284aba09d41b0fa8fd /src
parentc6481661571e00e264beeb9a21ae916792a4d3be (diff)
downloadevr-e6e6285d4faca3795de4250b4ca07fc1d57b849b.tar.gz
Add timeout feature
Diffstat (limited to 'src')
-rw-r--r--src/backends/python.rs32
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