summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/systemc/core/scheduler.cc19
1 files changed, 6 insertions, 13 deletions
diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc
index bc08d5556..ceaa5f474 100644
--- a/src/systemc/core/scheduler.cc
+++ b/src/systemc/core/scheduler.cc
@@ -196,10 +196,8 @@ Scheduler::runReady()
e->run();
deltas.clear();
- if (runOnce) {
- eq->reschedule(&maxTickEvent, eq->getCurTick());
- runOnce = false;
- }
+ if (runOnce)
+ schedulePause();
}
void
@@ -220,14 +218,6 @@ Scheduler::pause()
kernel->status(::sc_core::SC_PAUSED);
runOnce = false;
scMain->run();
-
- // If the ready event is supposed to run now, run it inline so that it
- // preempts any delta notifications which were scheduled while we were
- // paused.
- if (readyEvent.scheduled()) {
- eq->deschedule(&readyEvent);
- runReady();
- }
}
void
@@ -298,13 +288,16 @@ Scheduler::scheduleStop(bool finish_delta)
if (!finish_delta) {
// If we're not supposed to finish the delta cycle, flush the list
- // of ready processes and scheduled updates.
+ // of ready processes, scheduled updates, and delta notifications.
Process *p;
while ((p = readyList.getNext()))
p->popListNode();
Channel *c;
while ((c = updateList.getNext()))
c->popListNode();
+ for (auto &e: deltas)
+ e->deschedule();
+ deltas.clear();
}
eq->schedule(&stopEvent, eq->getCurTick());
}