Fix a bug with multiple interleaved events in SimulatedEventLoop
The new test used to segfault, and now it works correctly.
Change-Id: I2dd35ee637f42d8ff926c508fa3872227fe6cdab
diff --git a/aos/events/event_loop.cc b/aos/events/event_loop.cc
index da89d9b..e69fd0d 100644
--- a/aos/events/event_loop.cc
+++ b/aos/events/event_loop.cc
@@ -442,12 +442,20 @@
namespace {
bool CompareEvents(const EventLoopEvent *first, const EventLoopEvent *second) {
- return first->event_time() > second->event_time();
+ if (first->event_time() > second->event_time()) {
+ return true;
+ }
+ if (first->event_time() < second->event_time()) {
+ return false;
+ }
+ return first->generation() > second->generation();
}
} // namespace
void EventLoop::AddEvent(EventLoopEvent *event) {
DCHECK(std::find(events_.begin(), events_.end(), event) == events_.end());
+ DCHECK(event->generation() == 0);
+ event->set_generation(++event_generation_);
events_.push_back(event);
std::push_heap(events_.begin(), events_.end(), CompareEvents);
}
@@ -455,6 +463,7 @@
void EventLoop::RemoveEvent(EventLoopEvent *event) {
auto e = std::find(events_.begin(), events_.end(), event);
if (e != events_.end()) {
+ DCHECK(event->generation() != 0);
events_.erase(e);
std::make_heap(events_.begin(), events_.end(), CompareEvents);
event->Invalidate();