diff options
-rw-r--r-- | src/systemc/core/scheduler.cc | 19 |
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()); } |