From b89fd576633f63b14b8e5eb24de377e4918c363d Mon Sep 17 00:00:00 2001 From: Curtis Dunham Date: Fri, 19 Dec 2014 15:32:34 -0600 Subject: [PATCH] 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. --- src/sim/simulate.cc | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) 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 -- 2.30.2