systemc: Fix a couple memory errors.
authorGabe Black <gabeblack@google.com>
Sat, 21 Jul 2018 00:18:22 +0000 (17:18 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 11 Sep 2018 21:43:25 +0000 (21:43 +0000)
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>

src/systemc/core/event.cc
src/systemc/core/event.hh
src/systemc/core/object.cc
src/systemc/core/object.hh

index 1623cf9e867a797c76e3066642a4e919baef4d79..05670fe59073e6f2d5990e01870eedc1f00e5750 100644 (file)
@@ -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();
     }
 
index 6d2f46d4218cd593aa3b872dee7eb3727edd906d..f9d3b204068f897066d2a0f39eba0a620a328cd1 100644 (file)
@@ -103,7 +103,6 @@ class Event
     bool _inHierarchy;
 
     sc_core::sc_object *parent;
-    EventsIt parentIt;
 
     void delayedNotify();
     EventWrapper<Event, &Event::delayedNotify> delayedNotifyEvent;
index 39403ca34de84220afc0e8cd1355e85a00a7da63..13476619b88b9d67b5d5de35e345a48d410f9b28 100644 (file)
@@ -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();
 }
index c87a98b2dc970fd6265b5a39ada39d9c8ecd0c04..cb759d8907cd560700eb746f8a82252ef611527c 100644 (file)
@@ -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;