changeset 3bfbaefa3844 in /z/repo/gem5 details: http://repo.gem5.org/gem5?cmd=changeset;node=3bfbaefa3844 description: 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. diffstat: src/sim/simulate.cc | 21 ++++++++++----------- 1 files changed, 10 insertions(+), 11 deletions(-) diffs (51 lines): diff -r aae98c1cf4a0 -r 3bfbaefa3844 src/sim/simulate.cc --- a/src/sim/simulate.cc Tue Feb 03 14:25:27 2015 -0500 +++ b/src/sim/simulate.cc Fri Dec 19 15:32:34 2014 -0600 @@ -192,37 +192,36 @@ 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<EventQueue> lock(*eventq); - async_event = false; if (async_statdump || async_statreset) { Stats::schedStatEvent(async_statdump, async_statreset); async_statdump = false; async_statreset = false; } + if (async_io) { + async_io = false; + pollQueue.service(); + } + if (async_exit) { async_exit = false; exitSimLoop("user interrupt received"); } - if (async_io) { - async_io = false; - pollQueue.service(); - } - 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 _______________________________________________ gem5-dev mailing list gem5-dev@gem5.org http://m5sim.org/mailman/listinfo/gem5-dev