From ee5605e55676752335420dfddb98860f7d8ecd89 Mon Sep 17 00:00:00 2001 From: balrog Date: Mon, 3 Dec 2007 03:01:40 +0000 Subject: 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 --- vl.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) (limited to 'vl.c') diff --git a/vl.c b/vl.c index 3a694c4..70f250e 100644 --- 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; -- cgit v1.1