Gabe Black has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/12039
Change subject: systemc: Fix a couple memory errors.
......................................................................
systemc: Fix a couple memory errors.
Because events are held in vectors, it doesn't make sense to keep an
iterator into the parent to keep track of where that event is for easy
removal since the iterator becomes invalid when the vector is changed.
The events need to be stored in a vector because systemc defines an
accessor which returns that vector, and building a vector on the fly
would be cumbersome.
Also, make sure the Event parent pointer is set to nullptr if there
isn't a parent.
Change-Id: I63a676190e7747e60baaca50009161d47bfc1c54
---
M src/systemc/core/event.cc
M src/systemc/core/event.hh
M src/systemc/core/object.cc
M src/systemc/core/object.hh
4 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/src/systemc/core/event.cc b/src/systemc/core/event.cc
index 1623cf9..05670fe 100644
--- a/src/systemc/core/event.cc
+++ b/src/systemc/core/event.cc
@@ -29,6 +29,7 @@
#include "systemc/core/event.hh"
+#include <algorithm>
#include <cstring>
#include <utility>
@@ -51,12 +52,14 @@
parent = p->obj()->sc_obj();
else if (scheduler.current())
parent = scheduler.current();
+ else
+ parent = nullptr;
if (parent) {
Object *obj = Object::getFromScObject(parent);
- parentIt = obj->addChildEvent(_sc_event);
+ obj->addChildEvent(_sc_event);
} else {
- parentIt = topLevelEvents.emplace(topLevelEvents.end(), _sc_event);
+ topLevelEvents.emplace(topLevelEvents.end(), _sc_event);
}
if (parent)
@@ -74,9 +77,12 @@
{
if (parent) {
Object *obj = Object::getFromScObject(parent);
- obj->delChildEvent(parentIt);
+ obj->delChildEvent(_sc_event);
} else {
- std::swap(*parentIt, topLevelEvents.back());
+ EventsIt it = find(topLevelEvents.begin(), topLevelEvents.end(),
+ _sc_event);
+ assert(it != topLevelEvents.end());
+ std::swap(*it, topLevelEvents.back());
topLevelEvents.pop_back();
}
diff --git a/src/systemc/core/event.hh b/src/systemc/core/event.hh
index 6d2f46d..f9d3b20 100644
--- a/src/systemc/core/event.hh
+++ b/src/systemc/core/event.hh
@@ -103,7 +103,6 @@
bool _inHierarchy;
sc_core::sc_object *parent;
- EventsIt parentIt;
void delayedNotify();
EventWrapper<Event, &Event::delayedNotify> delayedNotifyEvent;
diff --git a/src/systemc/core/object.cc b/src/systemc/core/object.cc
index 39403ca..1347661 100644
--- a/src/systemc/core/object.cc
+++ b/src/systemc/core/object.cc
@@ -29,6 +29,8 @@
#include "systemc/core/object.hh"
+#include <algorithm>
+
#include "base/logging.hh"
#include "systemc/core/module.hh"
#include "systemc/core/scheduler.hh"
@@ -230,8 +232,10 @@
}
void
-Object::delChildEvent(EventsIt it)
+Object::delChildEvent(sc_core::sc_event *e)
{
+ EventsIt it = std::find(events.begin(), events.end(), e);
+ assert(it != events.end());
std::swap(*it, events.back());
events.pop_back();
}
diff --git a/src/systemc/core/object.hh b/src/systemc/core/object.hh
index c87a98b..cb759d8 100644
--- a/src/systemc/core/object.hh
+++ b/src/systemc/core/object.hh
@@ -88,7 +88,7 @@
sc_core::sc_object *sc_obj() { return _sc_obj; }
EventsIt addChildEvent(sc_core::sc_event *e);
- void delChildEvent(EventsIt it);
+ void delChildEvent(sc_core::sc_event *e);
private:
sc_core::sc_object *_sc_obj;
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/12039
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I63a676190e7747e60baaca50009161d47bfc1c54
Gerrit-Change-Number: 12039
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev