Commit ee5605e55676752335420dfddb98860f7d8ecd89
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
vl.c
| ... | ... | @@ -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; | ... | ... |