summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-07-20 17:18:22 -0700
committerGabe Black <gabeblack@google.com>2018-09-11 21:43:25 +0000
commitbe38309891b4adb91e9a6b56923f1f9e82487e61 (patch)
tree3ac17c2652f12a1debf355c75a0cd94b0bfddaeb
parentfbf406d0a63ec42ab0ac09788e16eab2a4839230 (diff)
downloadgem5-be38309891b4adb91e9a6b56923f1f9e82487e61.tar.xz
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 Reviewed-on: https://gem5-review.googlesource.com/12039 Reviewed-by: Gabe Black <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
-rw-r--r--src/systemc/core/event.cc14
-rw-r--r--src/systemc/core/event.hh1
-rw-r--r--src/systemc/core/object.cc6
-rw-r--r--src/systemc/core/object.hh2
4 files changed, 16 insertions, 7 deletions
diff --git a/src/systemc/core/event.cc b/src/systemc/core/event.cc
index 1623cf9e8..05670fe59 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 @@ Event::Event(sc_core::sc_event *_sc_event, const char *_basename) :
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 @@ Event::~Event()
{
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 6d2f46d42..f9d3b2040 100644
--- a/src/systemc/core/event.hh
+++ b/src/systemc/core/event.hh
@@ -103,7 +103,6 @@ class Event
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 39403ca34..13476619b 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 @@ Object::addChildEvent(sc_core::sc_event *e)
}
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 c87a98b2d..cb759d890 100644
--- a/src/systemc/core/object.hh
+++ b/src/systemc/core/object.hh
@@ -88,7 +88,7 @@ class Object
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;