summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/sim/simulate.cc21
1 files 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<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_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