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