Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/12222

Change subject: systemc: Improve scheduler cleanup.
......................................................................

systemc: Improve scheduler cleanup.

Make the scheduler clear itself out when it's destructed to ensure that
nobody will try to use it after it's gone away. Also make sure there
are no pending events which might refer to it as well, either systemc
events or gem5 events.

Change-Id: I12dadc06bd9db7016a8dc0c1827b3e630b0d23d5
---
M src/systemc/core/channel.cc
M src/systemc/core/process.hh
M src/systemc/core/scheduler.cc
M src/systemc/core/scheduler.hh
4 files changed, 45 insertions(+), 0 deletions(-)



diff --git a/src/systemc/core/channel.cc b/src/systemc/core/channel.cc
index 49d9f6c..04f158b 100644
--- a/src/systemc/core/channel.cc
+++ b/src/systemc/core/channel.cc
@@ -41,6 +41,7 @@

 Channel::~Channel()
 {
+    popListNode();
     allChannels.erase(this);
 }

diff --git a/src/systemc/core/process.hh b/src/systemc/core/process.hh
index 2c07975..384250c 100644
--- a/src/systemc/core/process.hh
+++ b/src/systemc/core/process.hh
@@ -330,6 +330,7 @@

     virtual ~Process()
     {
+        popListNode();
         delete func;
         for (auto s: staticSensitivities)
             delete s;
diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc
index cdebd99..6762086 100644
--- a/src/systemc/core/scheduler.cc
+++ b/src/systemc/core/scheduler.cc
@@ -50,6 +50,48 @@
     runOnce(false)
 {}

+Scheduler::~Scheduler()
+{
+    // Clear out everything that belongs to us to make sure nobody tries to
+    // clear themselves out after the scheduler goes away.
+
+    // Delta notifications.
+    for (auto &e: deltas)
+        e->deschedule();
+
+    // Timed notifications.
+    for (auto &ts: timeSlots) {
+        for (auto &e: ts.second->events)
+            e->deschedule();
+        delete ts.second;
+        ts.second = nullptr;
+    }
+
+    // gem5 events.
+    if (readyEvent.scheduled())
+        eq->deschedule(&readyEvent);
+    if (pauseEvent.scheduled())
+        eq->deschedule(&pauseEvent);
+    if (stopEvent.scheduled())
+        eq->deschedule(&stopEvent);
+    if (starvationEvent.scheduled())
+        eq->deschedule(&starvationEvent);
+    if (maxTickEvent.scheduled())
+        eq->deschedule(&maxTickEvent);
+
+    Process *p;
+    while ((p = toFinalize.getNext()))
+        p->popListNode();
+    while ((p = initList.getNext()))
+        p->popListNode();
+    while ((p = readyList.getNext()))
+        p->popListNode();
+
+    Channel *c;
+    while ((c = updateList.getNext()))
+        c->popListNode();
+}
+
 void
 Scheduler::initPhase()
 {
diff --git a/src/systemc/core/scheduler.hh b/src/systemc/core/scheduler.hh
index c22bdf8..24b7fd2 100644
--- a/src/systemc/core/scheduler.hh
+++ b/src/systemc/core/scheduler.hh
@@ -159,6 +159,7 @@
     typedef std::map<Tick, TimeSlot *> TimeSlots;

     Scheduler();
+    ~Scheduler();

     const std::string name() const { return "systemc_scheduler"; }


--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/12222
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: I12dadc06bd9db7016a8dc0c1827b3e630b0d23d5
Gerrit-Change-Number: 12222
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

Reply via email to