From: Gabe Black Date: Fri, 17 Aug 2018 02:01:28 +0000 (-0700) Subject: systemc: Don't run the ready event inline when unpausing. X-Git-Tag: v19.0.0.0~1755 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=440b143742ece282c2b0497c70818a5796f66f1a;p=gem5.git systemc: Don't run the ready event inline when unpausing. Now that delta events are handled explicitly by the scheduler, there's no reason to run the readyEvent inline when returning from a pause. The delta events will necessarily be run after the evaluate and update phases. Change-Id: Iad6d431a87742354e3a46a0fb44c309aa785ea60 Reviewed-on: https://gem5-review.googlesource.com/12214 Reviewed-by: Gabe Black Maintainer: Gabe Black --- 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()); }