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

Reply via email to