Skip to content

Commit 29bc4e3

Browse files
committed
Fix Events::<drain/clear> bug (#2206)
Taken from #2145 On draining and clearing, dangling `EventReaders` would not read into the correct event offset.
1 parent 3c96131 commit 29bc4e3

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

crates/bevy_ecs/src/event.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,14 +328,24 @@ impl<T: Component> Events<T> {
328328
events.update();
329329
}
330330

331+
#[inline]
332+
fn reset_start_event_count(&mut self) {
333+
self.a_start_event_count = self.event_count;
334+
self.b_start_event_count = self.event_count;
335+
}
336+
331337
/// Removes all events.
338+
#[inline]
332339
pub fn clear(&mut self) {
340+
self.reset_start_event_count();
333341
self.events_a.clear();
334342
self.events_b.clear();
335343
}
336344

337345
/// Creates a draining iterator that removes all events.
338346
pub fn drain(&mut self) -> impl Iterator<Item = T> + '_ {
347+
self.reset_start_event_count();
348+
339349
let map = |i: EventInstance<T>| i.event;
340350
match self.state {
341351
State::A => self
@@ -480,4 +490,40 @@ mod tests {
480490
) -> Vec<TestEvent> {
481491
reader.iter(events).cloned().collect::<Vec<TestEvent>>()
482492
}
493+
494+
#[derive(PartialEq, Eq, Debug)]
495+
struct E(usize);
496+
497+
fn events_clear_and_read_impl(clear_func: impl FnOnce(&mut Events<E>)) {
498+
let mut events = Events::<E>::default();
499+
let mut reader = events.get_reader();
500+
501+
assert!(reader.iter(&events).next().is_none());
502+
503+
events.send(E(0));
504+
assert_eq!(*reader.iter(&events).next().unwrap(), E(0));
505+
assert_eq!(reader.iter(&events).next(), None);
506+
507+
events.send(E(1));
508+
clear_func(&mut events);
509+
assert!(reader.iter(&events).next().is_none());
510+
511+
events.send(E(2));
512+
events.update();
513+
events.send(E(3));
514+
515+
assert!(reader.iter(&events).eq([E(2), E(3)].iter()));
516+
}
517+
518+
#[test]
519+
fn test_events_clear_and_read() {
520+
events_clear_and_read_impl(|events| events.clear());
521+
}
522+
523+
#[test]
524+
fn test_events_drain_and_read() {
525+
events_clear_and_read_impl(|events| {
526+
assert!(events.drain().eq(vec![E(0), E(1)].into_iter()));
527+
});
528+
}
483529
}

0 commit comments

Comments
 (0)