diff options
Diffstat (limited to 'crates/driver/src/driver.rs')
-rw-r--r-- | crates/driver/src/driver.rs | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/crates/driver/src/driver.rs b/crates/driver/src/driver.rs index 58d356b..c401f27 100644 --- a/crates/driver/src/driver.rs +++ b/crates/driver/src/driver.rs @@ -351,7 +351,7 @@ impl<'ctx> Driver<'ctx> { Ok(()) } - fn wait_for_task(&mut self) -> Result<()> { + fn wait_for_task(&mut self) -> Result<bool> { let mut pollfds: Vec<_> = self .tasks_running .values() @@ -382,31 +382,45 @@ impl<'ctx> Driver<'ctx> { let (socket, task_ref) = self.tasks_running.remove(&fd).unwrap(); - let task_output = Runner::result(&socket)?; - self.update_runnable(task_ref, task_output); + match Runner::result(&socket) { + Ok(task_output) => { + self.update_runnable(task_ref, task_output); + } + Err(error) => { + eprintln!("{}", error); + return Ok(false); + } + } } - Ok(()) - } - - fn is_empty(&self) -> bool { - self.tasks_runnable.is_empty() && self.tasks_running.is_empty() + Ok(true) } fn is_done(&self) -> bool { - self.is_empty() && self.tasks_blocked.is_empty() + self.tasks_blocked.is_empty() + && self.tasks_runnable.is_empty() + && self.tasks_running.is_empty() } - pub fn run(&mut self, runner: &Runner) -> Result<()> { - while !self.is_empty() { - self.run_tasks(runner)?; - self.wait_for_task()?; - } + pub fn run(&mut self, runner: &Runner) -> Result<bool> { + let mut success = true; - assert!(self.is_done(), "No runnable tasks left"); + self.run_tasks(runner)?; - self.state.print_summary(); + while !self.tasks_running.is_empty() { + if !self.wait_for_task()? { + success = false; + } + if success { + self.run_tasks(runner)?; + } + } - Ok(()) + if success { + assert!(self.is_done(), "No runnable tasks left"); + self.state.print_summary(); + } + + Ok(success) } } |