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
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev