From 28eb4f6247bd3a6bc75b2878158ca8f68cc20c6f Mon Sep 17 00:00:00 2001 From: Mike Hsu Date: Mon, 30 Jan 2023 17:02:49 -0800 Subject: [PATCH] change exclusive systems too --- .../src/scheduling/executor/multi_threaded.rs | 38 +++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/crates/bevy_ecs/src/scheduling/executor/multi_threaded.rs b/crates/bevy_ecs/src/scheduling/executor/multi_threaded.rs index 51d6d301fed65..ad2fbe8822470 100644 --- a/crates/bevy_ecs/src/scheduling/executor/multi_threaded.rs +++ b/crates/bevy_ecs/src/scheduling/executor/multi_threaded.rs @@ -186,7 +186,7 @@ impl SystemExecutor for MultiThreadedExecutor { .receiver .recv() .await - .expect("a system has panicked and closed the channel"); + .expect("A system has panicked so the executor cannot continue."); self.finish_system_and_signal_dependents(index); @@ -492,13 +492,21 @@ impl MultiThreadedExecutor { let task = async move { #[cfg(feature = "trace")] let system_guard = system_span.enter(); - apply_system_buffers(&mut unapplied_systems, systems, world); + let res = std::panic::catch_unwind(AssertUnwindSafe(|| { + apply_system_buffers(&mut unapplied_systems, systems, world); + })); #[cfg(feature = "trace")] drop(system_guard); - sender - .send(system_index) - .await - .unwrap_or_else(|error| unreachable!("{}", error)); + if res.is_err() { + // close the channel to propagate the error to the + // multithreaded executor + sender.close(); + } else { + sender + .send(system_index) + .await + .unwrap_or_else(|error| unreachable!("{}", error)); + } }; #[cfg(feature = "trace")] @@ -508,13 +516,21 @@ impl MultiThreadedExecutor { let task = async move { #[cfg(feature = "trace")] let system_guard = system_span.enter(); - system.run((), world); + let res = std::panic::catch_unwind(AssertUnwindSafe(|| { + system.run((), world); + })); #[cfg(feature = "trace")] drop(system_guard); - sender - .send(system_index) - .await - .unwrap_or_else(|error| unreachable!("{}", error)); + if res.is_err() { + // close the channel to propagate the error to the + // multithreaded executor + sender.close(); + } else { + sender + .send(system_index) + .await + .unwrap_or_else(|error| unreachable!("{}", error)); + } }; #[cfg(feature = "trace")]