Today the only way the main loop exits is upon a system shutdown
request.  This is baked into the logic of the main loop.

Introduce a main_loop_quit function to explicitly request that
the main loop exits and refactor shutdown to use it.  This is
closer to how most main loops work.

Signed-off-by: Anthony Liguori <aligu...@us.ibm.com>
---
 include/qemu/main-loop.h |  3 +++
 main-loop.c              | 13 +++++++++++++
 vl.c                     |  9 +++++----
 3 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/include/qemu/main-loop.h b/include/qemu/main-loop.h
index e8059c3..758b435 100644
--- a/include/qemu/main-loop.h
+++ b/include/qemu/main-loop.h
@@ -303,4 +303,7 @@ void qemu_iohandler_poll(fd_set *readfds, fd_set *writefds, 
fd_set *xfds, int rc
 QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque);
 void qemu_bh_schedule_idle(QEMUBH *bh);
 
+bool main_loop_should_quit(void);
+void main_loop_quit(void);
+
 #endif
diff --git a/main-loop.c b/main-loop.c
index 6f52ac3..d433c45 100644
--- a/main-loop.c
+++ b/main-loop.c
@@ -392,6 +392,19 @@ static int os_host_main_loop_wait(uint32_t timeout)
 }
 #endif
 
+static bool do_main_loop_quit;
+
+bool main_loop_should_quit(void)
+{
+    return do_main_loop_quit;
+}
+
+void main_loop_quit(void)
+{
+    do_main_loop_quit = true;
+    qemu_notify_event();
+}
+
 int main_loop_wait(int nonblocking)
 {
     int ret;
diff --git a/vl.c b/vl.c
index c5b0eea..d6c5626 100644
--- a/vl.c
+++ b/vl.c
@@ -1942,7 +1942,7 @@ void qemu_system_vmstop_request(RunState state)
     qemu_notify_event();
 }
 
-static bool main_loop_should_exit(void)
+static void main_loop_junk(void)
 {
     RunState r;
     if (qemu_debug_requested()) {
@@ -1957,7 +1957,8 @@ static bool main_loop_should_exit(void)
         if (no_shutdown) {
             vm_stop(RUN_STATE_SHUTDOWN);
         } else {
-            return true;
+            main_loop_quit();
+            return;
         }
     }
     if (qemu_reset_requested()) {
@@ -1983,7 +1984,6 @@ static bool main_loop_should_exit(void)
     if (qemu_vmstop_requested(&r)) {
         vm_stop(r);
     }
-    return false;
 }
 
 static void main_loop(void)
@@ -2002,7 +2002,8 @@ static void main_loop(void)
 #ifdef CONFIG_PROFILER
         dev_time += profile_getclock() - ti;
 #endif
-    } while (!main_loop_should_exit());
+        main_loop_junk();
+    } while (!main_loop_should_quit());
 }
 
 static void version(void)
-- 
1.8.0


Reply via email to