Commit ee5605e55676752335420dfddb98860f7d8ecd89

Authored by balrog
1 parent 001a3f5a

Ensure a SIGALRM results in a break out from the cpu loop.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3769 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 20 additions and 14 deletions
... ... @@ -233,6 +233,10 @@ const char *prom_envs[MAX_PROM_ENVS];
233 233 int nb_drives_opt;
234 234 char drives_opt[MAX_DRIVES][1024];
235 235  
  236 +static CPUState *cur_cpu;
  237 +static CPUState *next_cpu;
  238 +static int event_pending;
  239 +
236 240 #define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
237 241  
238 242 /***********************************************************/
... ... @@ -1180,16 +1184,16 @@ static void host_alarm_handler(int host_signum)
1180 1184 struct qemu_alarm_win32 *data = ((struct qemu_alarm_timer*)dwUser)->priv;
1181 1185 SetEvent(data->host_alarm);
1182 1186 #endif
1183   - CPUState *env = cpu_single_env;
1184   - if (env) {
1185   - /* stop the currently executing cpu because a timer occured */
1186   - cpu_interrupt(env, CPU_INTERRUPT_EXIT);
  1187 + CPUState *env = next_cpu;
  1188 +
  1189 + /* stop the currently executing cpu because a timer occured */
  1190 + cpu_interrupt(env, CPU_INTERRUPT_EXIT);
1187 1191 #ifdef USE_KQEMU
1188   - if (env->kqemu_enabled) {
1189   - kqemu_cpu_interrupt(env);
1190   - }
1191   -#endif
  1192 + if (env->kqemu_enabled) {
  1193 + kqemu_cpu_interrupt(env);
1192 1194 }
  1195 +#endif
  1196 + event_pending = 1;
1193 1197 }
1194 1198 }
1195 1199  
... ... @@ -7340,8 +7344,6 @@ void main_loop_wait(int timeout)
7340 7344  
7341 7345 }
7342 7346  
7343   -static CPUState *cur_cpu;
7344   -
7345 7347 static int main_loop(void)
7346 7348 {
7347 7349 int ret, timeout;
... ... @@ -7351,15 +7353,13 @@ static int main_loop(void)
7351 7353 CPUState *env;
7352 7354  
7353 7355 cur_cpu = first_cpu;
  7356 + next_cpu = cur_cpu->next_cpu ?: first_cpu;
7354 7357 for(;;) {
7355 7358 if (vm_running) {
7356 7359  
7357   - env = cur_cpu;
7358 7360 for(;;) {
7359 7361 /* get next cpu */
7360   - env = env->next_cpu;
7361   - if (!env)
7362   - env = first_cpu;
  7362 + env = next_cpu;
7363 7363 #ifdef CONFIG_PROFILER
7364 7364 ti = profile_getclock();
7365 7365 #endif
... ... @@ -7367,6 +7367,12 @@ static int main_loop(void)
7367 7367 #ifdef CONFIG_PROFILER
7368 7368 qemu_time += profile_getclock() - ti;
7369 7369 #endif
  7370 + next_cpu = env->next_cpu ?: first_cpu;
  7371 + if (event_pending) {
  7372 + ret = EXCP_INTERRUPT;
  7373 + event_pending = 0;
  7374 + break;
  7375 + }
7370 7376 if (ret == EXCP_HLT) {
7371 7377 /* Give the next CPU a chance to run. */
7372 7378 cur_cpu = env;
... ...