From a466c57611ac645cfe5f3af2ff2f20be2f30f395 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 6 Apr 2024 23:54:33 +0200 Subject: driver: do not kill remaining tasks immediately on failure --- crates/driver/src/driver.rs | 48 +++++++++++++++++++++++++++++---------------- crates/driver/src/main.rs | 13 +++++++++--- 2 files changed, 41 insertions(+), 20 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 { 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 { + 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) } } diff --git a/crates/driver/src/main.rs b/crates/driver/src/main.rs index 98aa10a..44e5e1d 100644 --- a/crates/driver/src/main.rs +++ b/crates/driver/src/main.rs @@ -62,8 +62,15 @@ fn main() { } let taskset = rsv.into_taskset(); let mut driver = driver::Driver::new(&ctx, taskset, force_run).unwrap(); - if let Err(error) = driver.run(&runner) { - eprintln!("{}", error); - std::process::exit(1); + match driver.run(&runner) { + Ok(success) => { + if !success { + std::process::exit(1); + } + } + Err(error) => { + eprintln!("{}", error); + std::process::exit(1); + } } } -- cgit v1.2.3