summaryrefslogtreecommitdiffstats
path: root/src/backends/python.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends/python.rs')
-rw-r--r--src/backends/python.rs34
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