From: Curtis Dunham Date: Fri, 19 Dec 2014 21:32:34 +0000 (-0600) Subject: sim: prioritize async events; prevent starvation X-Git-Tag: stable_2015_09_03~205 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b89fd576633f63b14b8e5eb24de377e4918c363d;p=gem5.git sim: prioritize async events; prevent starvation If a time quantum event is the only one in the queue, async events (Ctrl-C, I/O, etc.) will never be processed. So process them first. --- diff --git a/src/sim/simulate.cc b/src/sim/simulate.cc index 426c3e662..7d88dc11d 100644 --- a/src/sim/simulate.cc +++ b/src/sim/simulate.cc @@ -192,37 +192,36 @@ doSimLoop(EventQueue *eventq) assert(curTick() <= eventq->nextTick() && "event scheduled in the past"); - Event *exit_event = eventq->serviceOne(); - if (exit_event != NULL) { - return exit_event; - } - if (async_event && testAndClearAsyncEvent()) { // Take the event queue lock in case any of the service // routines want to schedule new events. std::lock_guard lock(*eventq); - async_event = false; if (async_statdump || async_statreset) { Stats::schedStatEvent(async_statdump, async_statreset); async_statdump = false; async_statreset = false; } - if (async_exit) { - async_exit = false; - exitSimLoop("user interrupt received"); - } - if (async_io) { async_io = false; pollQueue.service(); } + if (async_exit) { + async_exit = false; + exitSimLoop("user interrupt received"); + } + if (async_exception) { async_exception = false; return NULL; } } + + Event *exit_event = eventq->serviceOne(); + if (exit_event != NULL) { + return exit_event; + } } // not reached... only exit is return on SimLoopExitEvent