do not use qemu_event_increment outside qemu_notify_event

qemu_notify_event in the non-iothread case is only stopping the current
CPU.  However, if the CPU is idle and the main loop is in the select
call then a call to qemu_event_increment is needed too (as done in
host_alarm_handler).  Since in general one doesn't know whether the CPU
is executing or not, it is a safe bet to always do qemu_event_increment.

Another way to see it: after this patch qemu_event_increment is the
"common part" of qemu_notify_event for both the CONFIG_IOTHREAD and
!CONFIG_IOTHREAD cases, which makes sense.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Paolo Bonzini 2010-03-10 11:38:42 +01:00 committed by Anthony Liguori
parent 1828be316f
commit 7a5e583811

3
vl.c
View File

@ -1053,7 +1053,7 @@ static void host_alarm_handler(int host_signum)
qemu_get_clock(rt_clock)) || qemu_get_clock(rt_clock)) ||
qemu_timer_expired(active_timers[QEMU_CLOCK_HOST], qemu_timer_expired(active_timers[QEMU_CLOCK_HOST],
qemu_get_clock(host_clock))) { qemu_get_clock(host_clock))) {
qemu_event_increment();
t->expired = alarm_has_dynticks(t); t->expired = alarm_has_dynticks(t);
#ifndef CONFIG_IOTHREAD #ifndef CONFIG_IOTHREAD
@ -3360,6 +3360,7 @@ void qemu_notify_event(void)
{ {
CPUState *env = cpu_single_env; CPUState *env = cpu_single_env;
qemu_event_increment ();
if (env) { if (env) {
cpu_exit(env); cpu_exit(env);
} }