diff --git a/crates/bevy_ecs/src/schedule/executor_parallel.rs b/crates/bevy_ecs/src/schedule/executor_parallel.rs index b6e5cccc60..3311a45118 100644 --- a/crates/bevy_ecs/src/schedule/executor_parallel.rs +++ b/crates/bevy_ecs/src/schedule/executor_parallel.rs @@ -175,7 +175,7 @@ impl ParallelExecutor { fn prepare_systems<'scope>( &mut self, scope: &mut Scope<'scope, ()>, - systems: &'scope [ParallelSystemContainer], + systems: &'scope mut [ParallelSystemContainer], world: &'scope World, ) { #[cfg(feature = "trace")] @@ -183,13 +183,15 @@ impl ParallelExecutor { #[cfg(feature = "trace")] let _guard = span.enter(); self.should_run.clear(); - for (index, system_data) in self.system_metadata.iter_mut().enumerate() { + for (index, (system_data, system)) in + self.system_metadata.iter_mut().zip(systems).enumerate() + { // Spawn the system task. - if systems[index].should_run() { + if system.should_run() { self.should_run.set(index, true); let start_receiver = system_data.start_receiver.clone(); let finish_sender = self.finish_sender.clone(); - let system = unsafe { systems[index].system_mut_unsafe() }; + let system = system.system_mut(); #[cfg(feature = "trace")] // NB: outside the task to get the TLS current span let system_span = bevy_utils::tracing::info_span!("system", name = &*system.name()); let task = async move { diff --git a/crates/bevy_ecs/src/schedule/system_container.rs b/crates/bevy_ecs/src/schedule/system_container.rs index 68e493da71..108e391d60 100644 --- a/crates/bevy_ecs/src/schedule/system_container.rs +++ b/crates/bevy_ecs/src/schedule/system_container.rs @@ -7,7 +7,7 @@ use crate::{ }, system::{ExclusiveSystem, System}, }; -use std::{borrow::Cow, cell::UnsafeCell}; +use std::borrow::Cow; /// System metadata like its name, labels, order requirements and component access. pub trait SystemContainer: GraphNode