sim: prioritize async events; prevent starvation
authorCurtis Dunham <Curtis.Dunham@arm.com>
Fri, 19 Dec 2014 21:32:34 +0000 (15:32 -0600)
committerCurtis Dunham <Curtis.Dunham@arm.com>
Fri, 19 Dec 2014 21:32:34 +0000 (15:32 -0600)
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

index 426c3e662b0cde4ae841c94cc27f507187af2a6b..7d88dc11d3941e6e44e1360fe3e434f63322a69b 100644 (file)
@@ -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