]> git.proxmox.com Git - qemu.git/blobdiff - vl.c
Ensure a SIGALRM results in a break out from the cpu loop.
[qemu.git] / vl.c
diff --git a/vl.c b/vl.c
index 3a694c47306f35fede236427b55bb35b9cf9b4b4..70f250ebedb0107a90d1c826b62889c0beb903f3 100644 (file)
--- a/vl.c
+++ b/vl.c
@@ -233,6 +233,10 @@ const char *prom_envs[MAX_PROM_ENVS];
 int nb_drives_opt;
 char drives_opt[MAX_DRIVES][1024];
 
+static CPUState *cur_cpu;
+static CPUState *next_cpu;
+static int event_pending;
+
 #define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
 
 /***********************************************************/
@@ -1180,16 +1184,16 @@ static void host_alarm_handler(int host_signum)
         struct qemu_alarm_win32 *data = ((struct qemu_alarm_timer*)dwUser)->priv;
         SetEvent(data->host_alarm);
 #endif
-        CPUState *env = cpu_single_env;
-        if (env) {
-            /* stop the currently executing cpu because a timer occured */
-            cpu_interrupt(env, CPU_INTERRUPT_EXIT);
+        CPUState *env = next_cpu;
+
+        /* stop the currently executing cpu because a timer occured */
+        cpu_interrupt(env, CPU_INTERRUPT_EXIT);
 #ifdef USE_KQEMU
-            if (env->kqemu_enabled) {
-                kqemu_cpu_interrupt(env);
-            }
-#endif
+        if (env->kqemu_enabled) {
+            kqemu_cpu_interrupt(env);
         }
+#endif
+        event_pending = 1;
     }
 }
 
@@ -7340,8 +7344,6 @@ void main_loop_wait(int timeout)
 
 }
 
-static CPUState *cur_cpu;
-
 static int main_loop(void)
 {
     int ret, timeout;
@@ -7351,15 +7353,13 @@ static int main_loop(void)
     CPUState *env;
 
     cur_cpu = first_cpu;
+    next_cpu = cur_cpu->next_cpu ?: first_cpu;
     for(;;) {
         if (vm_running) {
 
-            env = cur_cpu;
             for(;;) {
                 /* get next cpu */
-                env = env->next_cpu;
-                if (!env)
-                    env = first_cpu;
+                env = next_cpu;
 #ifdef CONFIG_PROFILER
                 ti = profile_getclock();
 #endif
@@ -7367,6 +7367,12 @@ static int main_loop(void)
 #ifdef CONFIG_PROFILER
                 qemu_time += profile_getclock() - ti;
 #endif
+                next_cpu = env->next_cpu ?: first_cpu;
+                if (event_pending) {
+                    ret = EXCP_INTERRUPT;
+                    event_pending = 0;
+                    break;
+                }
                 if (ret == EXCP_HLT) {
                     /* Give the next CPU a chance to run.  */
                     cur_cpu = env;