summaryrefslogtreecommitdiff
path: root/src/systemc
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc')
-rw-r--r--src/systemc/core/SConscript1
-rw-r--r--src/systemc/core/channel.cc1
-rw-r--r--src/systemc/core/process.hh1
-rw-r--r--src/systemc/core/sched_event.cc43
-rw-r--r--src/systemc/core/sched_event.hh2
-rw-r--r--src/systemc/core/scheduler.cc42
-rw-r--r--src/systemc/core/scheduler.hh1
7 files changed, 91 insertions, 0 deletions
diff --git a/src/systemc/core/SConscript b/src/systemc/core/SConscript
index 76327c860..4814e6afa 100644
--- a/src/systemc/core/SConscript
+++ b/src/systemc/core/SConscript
@@ -39,6 +39,7 @@ if env['USE_SYSTEMC']:
Source('process_types.cc')
Source('python.cc')
Source('scheduler.cc')
+ Source('sched_event.cc')
Source('sc_attr.cc')
Source('sc_event.cc')
diff --git a/src/systemc/core/channel.cc b/src/systemc/core/channel.cc
index 49d9f6cb7..04f158bea 100644
--- a/src/systemc/core/channel.cc
+++ b/src/systemc/core/channel.cc
@@ -41,6 +41,7 @@ Channel::Channel(sc_core::sc_prim_channel *_sc_chan) : _sc_chan(_sc_chan)
Channel::~Channel()
{
+ popListNode();
allChannels.erase(this);
}
diff --git a/src/systemc/core/process.hh b/src/systemc/core/process.hh
index 25d3e4eb0..267a7ed3d 100644
--- a/src/systemc/core/process.hh
+++ b/src/systemc/core/process.hh
@@ -330,6 +330,7 @@ class Process : public ::sc_core::sc_object, public ListNode
virtual ~Process()
{
+ popListNode();
delete func;
for (auto s: staticSensitivities)
delete s;
diff --git a/src/systemc/core/sched_event.cc b/src/systemc/core/sched_event.cc
new file mode 100644
index 000000000..576c23ba8
--- /dev/null
+++ b/src/systemc/core/sched_event.cc
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Gabe Black
+ */
+
+#include "systemc/core/sched_event.hh"
+
+#include "systemc/core/scheduler.hh"
+
+namespace sc_gem5
+{
+
+ScEvent::~ScEvent()
+{
+ if (scheduled())
+ scheduler.deschedule(this);
+}
+
+} // namespace sc_gem5
diff --git a/src/systemc/core/sched_event.hh b/src/systemc/core/sched_event.hh
index 63b76ef0a..9aefb7440 100644
--- a/src/systemc/core/sched_event.hh
+++ b/src/systemc/core/sched_event.hh
@@ -59,6 +59,8 @@ class ScEvent
work(work), _when(MaxTick), _scheduled(false)
{}
+ ~ScEvent();
+
bool scheduled() { return _scheduled; }
void when(Tick w) { _when = w; }
diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc
index cdebd9986..6762086a0 100644
--- a/src/systemc/core/scheduler.cc
+++ b/src/systemc/core/scheduler.cc
@@ -50,6 +50,48 @@ Scheduler::Scheduler() :
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 c22bdf870..24b7fd2ff 100644
--- a/src/systemc/core/scheduler.hh
+++ b/src/systemc/core/scheduler.hh
@@ -159,6 +159,7 @@ class Scheduler
typedef std::map<Tick, TimeSlot *> TimeSlots;
Scheduler();
+ ~Scheduler();
const std::string name() const { return "systemc_scheduler"; }