From 1a79f4d746d3ff23f0377590dc3f338ed6f6f893 Mon Sep 17 00:00:00 2001 From: TheRawMeatball Date: Wed, 23 Jun 2021 17:20:55 +0300 Subject: [PATCH 1/6] Increment last event count on next instead of iter --- crates/bevy_ecs/src/event.rs | 50 +++++++++++------------------------- 1 file changed, 15 insertions(+), 35 deletions(-) diff --git a/crates/bevy_ecs/src/event.rs b/crates/bevy_ecs/src/event.rs index 11de10b34d084..994c14a6f90a4 100644 --- a/crates/bevy_ecs/src/event.rs +++ b/crates/bevy_ecs/src/event.rs @@ -188,13 +188,13 @@ impl Default for ManualEventReader { impl ManualEventReader { /// See [`EventReader::iter`] - pub fn iter<'a>(&mut self, events: &'a Events) -> impl DoubleEndedIterator { + pub fn iter<'a>(&'a mut self, events: &'a Events) -> impl DoubleEndedIterator { internal_event_reader(&mut self.last_event_count, events).map(|(e, _)| e) } /// See [`EventReader::iter_with_id`] pub fn iter_with_id<'a>( - &mut self, + &'a mut self, events: &'a Events, ) -> impl DoubleEndedIterator)> { internal_event_reader(&mut self.last_event_count, events) @@ -204,9 +204,9 @@ impl ManualEventReader { /// Like [`iter_with_id`](EventReader::iter_with_id) except not emitting any traces for read /// messages. fn internal_event_reader<'a, T>( - last_event_count: &mut usize, + last_event_count: &'a mut usize, events: &'a Events, -) -> impl DoubleEndedIterator)> { +) -> impl DoubleEndedIterator)> + 'a { // if the reader has seen some of the events in a buffer, find the proper index offset. // otherwise read all events in the buffer let a_index = if *last_event_count > events.a_start_event_count { @@ -219,37 +219,17 @@ fn internal_event_reader<'a, T>( } else { 0 }; - *last_event_count = events.event_count; - match events.state { - State::A => events - .events_b - .get(b_index..) - .unwrap_or_else(|| &[]) - .iter() - .map(map_instance_event_with_id) - .chain( - events - .events_a - .get(a_index..) - .unwrap_or_else(|| &[]) - .iter() - .map(map_instance_event_with_id), - ), - State::B => events - .events_a - .get(a_index..) - .unwrap_or_else(|| &[]) - .iter() - .map(map_instance_event_with_id) - .chain( - events - .events_b - .get(b_index..) - .unwrap_or_else(|| &[]) - .iter() - .map(map_instance_event_with_id), - ), - } + let a = events.events_a.get(a_index..).unwrap_or_else(|| &[]); + let b = events.events_b.get(b_index..).unwrap_or_else(|| &[]); + let unread_count = a.len() + b.len(); + *last_event_count = events.event_count - unread_count; + let iterator = match events.state { + State::A => b.iter().chain(a.iter()), + State::B => a.iter().chain(b.iter()), + }; + iterator + .map(map_instance_event_with_id) + .inspect(move |_| *last_event_count += 1) } impl<'a, T: Component> EventReader<'a, T> { From afde1ac9a76ea3ff1cc94a8a69ef8b09ca0bb7ea Mon Sep 17 00:00:00 2001 From: TheRawMeatball Date: Wed, 23 Jun 2021 21:53:38 +0300 Subject: [PATCH 2/6] Improve lifetime seperation --- crates/bevy_ecs/src/event.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/crates/bevy_ecs/src/event.rs b/crates/bevy_ecs/src/event.rs index 994c14a6f90a4..a70f79ae15023 100644 --- a/crates/bevy_ecs/src/event.rs +++ b/crates/bevy_ecs/src/event.rs @@ -188,25 +188,28 @@ impl Default for ManualEventReader { impl ManualEventReader { /// See [`EventReader::iter`] - pub fn iter<'a>(&'a mut self, events: &'a Events) -> impl DoubleEndedIterator { + pub fn iter<'a: 'r, 'loc: 'r, 'r>( + &'loc mut self, + events: &'a Events, + ) -> impl DoubleEndedIterator + 'r { internal_event_reader(&mut self.last_event_count, events).map(|(e, _)| e) } /// See [`EventReader::iter_with_id`] - pub fn iter_with_id<'a>( - &'a mut self, + pub fn iter_with_id<'a: 'r, 'loc: 'r, 'r>( + &'loc mut self, events: &'a Events, - ) -> impl DoubleEndedIterator)> { + ) -> impl DoubleEndedIterator)> + 'r { internal_event_reader(&mut self.last_event_count, events) } } /// Like [`iter_with_id`](EventReader::iter_with_id) except not emitting any traces for read /// messages. -fn internal_event_reader<'a, T>( - last_event_count: &'a mut usize, +fn internal_event_reader<'a: 'r, 'loc: 'r, 'r, T>( + last_event_count: &'loc mut usize, events: &'a Events, -) -> impl DoubleEndedIterator)> + 'a { +) -> impl DoubleEndedIterator)> + 'r { // if the reader has seen some of the events in a buffer, find the proper index offset. // otherwise read all events in the buffer let a_index = if *last_event_count > events.a_start_event_count { From 14824a8c1b1fa9196c481abe91f432bbb2d8db8b Mon Sep 17 00:00:00 2001 From: TheRawMeatball Date: Wed, 23 Jun 2021 21:53:57 +0300 Subject: [PATCH 3/6] Fix split borrow issue --- crates/bevy_scene/src/scene_spawner.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/bevy_scene/src/scene_spawner.rs b/crates/bevy_scene/src/scene_spawner.rs index b62015c5095e1..df5a1d5f0f7ef 100644 --- a/crates/bevy_scene/src/scene_spawner.rs +++ b/crates/bevy_scene/src/scene_spawner.rs @@ -303,6 +303,7 @@ pub fn scene_spawner_system(world: &mut World) { .unwrap(); let mut updated_spawned_scenes = Vec::new(); + let scene_spawner = &mut *scene_spawner; for event in scene_spawner .scene_asset_event_reader .iter(&scene_asset_events) From b29f8a658017f4eff2eb2aa20c2f2cf1f06f35a2 Mon Sep 17 00:00:00 2001 From: TheRawMeatball Date: Thu, 24 Jun 2021 18:50:04 +0300 Subject: [PATCH 4/6] fix potential issue with next_back --- crates/bevy_ecs/src/event.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_ecs/src/event.rs b/crates/bevy_ecs/src/event.rs index a70f79ae15023..a2a7a2759a03f 100644 --- a/crates/bevy_ecs/src/event.rs +++ b/crates/bevy_ecs/src/event.rs @@ -232,7 +232,7 @@ fn internal_event_reader<'a: 'r, 'loc: 'r, 'r, T>( }; iterator .map(map_instance_event_with_id) - .inspect(move |_| *last_event_count += 1) + .inspect(move |(_, id)| *last_event_count = id.id.max(*last_event_count)) } impl<'a, T: Component> EventReader<'a, T> { From 19ab00b3d8b58720d8ca0c974150d752e22a3bee Mon Sep 17 00:00:00 2001 From: TheRawMeatball Date: Thu, 24 Jun 2021 19:30:36 +0300 Subject: [PATCH 5/6] fix test --- crates/bevy_ecs/src/event.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_ecs/src/event.rs b/crates/bevy_ecs/src/event.rs index a2a7a2759a03f..718ebfeee14b9 100644 --- a/crates/bevy_ecs/src/event.rs +++ b/crates/bevy_ecs/src/event.rs @@ -232,7 +232,7 @@ fn internal_event_reader<'a: 'r, 'loc: 'r, 'r, T>( }; iterator .map(map_instance_event_with_id) - .inspect(move |(_, id)| *last_event_count = id.id.max(*last_event_count)) + .inspect(move |(_, id)| *last_event_count = (id.id + 1).max(*last_event_count)) } impl<'a, T: Component> EventReader<'a, T> { From aac4deaf95ec3f07768b6ada088587e78e505779 Mon Sep 17 00:00:00 2001 From: Carter Anderson Date: Tue, 1 Feb 2022 17:49:41 -0800 Subject: [PATCH 6/6] simplify lifetimes --- crates/bevy_ecs/src/event.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/crates/bevy_ecs/src/event.rs b/crates/bevy_ecs/src/event.rs index 718ebfeee14b9..1f710f1e8e1a6 100644 --- a/crates/bevy_ecs/src/event.rs +++ b/crates/bevy_ecs/src/event.rs @@ -188,28 +188,25 @@ impl Default for ManualEventReader { impl ManualEventReader { /// See [`EventReader::iter`] - pub fn iter<'a: 'r, 'loc: 'r, 'r>( - &'loc mut self, - events: &'a Events, - ) -> impl DoubleEndedIterator + 'r { + pub fn iter<'a>(&'a mut self, events: &'a Events) -> impl DoubleEndedIterator { internal_event_reader(&mut self.last_event_count, events).map(|(e, _)| e) } /// See [`EventReader::iter_with_id`] - pub fn iter_with_id<'a: 'r, 'loc: 'r, 'r>( - &'loc mut self, + pub fn iter_with_id<'a>( + &'a mut self, events: &'a Events, - ) -> impl DoubleEndedIterator)> + 'r { + ) -> impl DoubleEndedIterator)> { internal_event_reader(&mut self.last_event_count, events) } } /// Like [`iter_with_id`](EventReader::iter_with_id) except not emitting any traces for read /// messages. -fn internal_event_reader<'a: 'r, 'loc: 'r, 'r, T>( - last_event_count: &'loc mut usize, +fn internal_event_reader<'a, T>( + last_event_count: &'a mut usize, events: &'a Events, -) -> impl DoubleEndedIterator)> + 'r { +) -> impl DoubleEndedIterator)> { // if the reader has seen some of the events in a buffer, find the proper index offset. // otherwise read all events in the buffer let a_index = if *last_event_count > events.a_start_event_count {