qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC] Ensure SIGALRM causes a cpu_loop_exit


From: andrzej zaborowski
Subject: Re: [Qemu-devel] [RFC] Ensure SIGALRM causes a cpu_loop_exit
Date: Sun, 25 Nov 2007 00:13:29 +0100

On 24/11/2007, Paul Brook <address@hidden> wrote:
> > There is a chance that when using "unix" or "dynticks" clock, the
> > signal arrives when no cpu is executing.

How about this version, this one touches vl.c only:

--- a/vl.c
+++ b/vl.c
@@ -236,6 +236,10 @@ const char *prom_envs[MAX_PROM_ENVS];
 struct bt_piconet_s *local_piconet;
 struct modem_ops_s modem_ops;

+static CPUState *cur_cpu;
+static CPUState *next_cpu;
+static int event_pending;
+
 #define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)

 /***********************************************************/
@@ -1183,16 +1187,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;
     }
 }

@@ -7168,8 +7172,6 @@ void main_loop_wait(int timeout)

 }

-static CPUState *cur_cpu;
-
 static int main_loop(void)
 {
     int ret, timeout;
@@ -7179,15 +7181,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
@@ -7195,6 +7195,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;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]