@@ -972,7 +972,10 @@ static int win32_start_timer(struct qemu_alarm_timer
*t)
timeGetDevCaps(&tc, sizeof(tc));
data->period = tc.wPeriodMin;
- timeBeginPeriod(data->period);
+ if (timeBeginPeriod(data->period) != TIMERR_NOERROR) {
+ fprintf(stderr, "Failed to initialize win32 alarm timer\n");
+ return -1;
+ }
flags = TIME_CALLBACK_FUNCTION;
if (alarm_has_dynticks(t))
@@ -990,6 +993,7 @@ static int win32_start_timer(struct qemu_alarm_timer *t)
fprintf(stderr, "Failed to initialize win32 alarm timer: %ld\n",
GetLastError());
timeEndPeriod(data->period);
+ data->period = 0;
return -1;
}
@@ -1000,8 +1004,10 @@ static void win32_stop_timer(struct qemu_alarm_timer
*t)
{
struct qemu_alarm_win32 *data = t->priv;
- timeKillEvent(data->timerId);
- timeEndPeriod(data->period);
+ if (data->timerId)
+ timeKillEvent(data->timerId);
+ if (data->period)
+ timeEndPeriod(data->period);
}
static void win32_rearm_timer(struct qemu_alarm_timer *t)
@@ -1027,6 +1033,7 @@ static void win32_rearm_timer(struct qemu_alarm_timer
*t)
GetLastError());
timeEndPeriod(data->period);
+ data->period = 0;
exit(1);
}
}
@@ -1061,6 +1068,7 @@ int init_timer_alarm(void)
t->pending = 1;
alarm_timer = t;
qemu_add_vm_change_state_handler(alarm_timer_on_change_state_rearm, t);
+ atexit(quit_timers);
return 0;
@@ -3118,7 +3118,6 @@ int main(int argc, char **argv, char **envp)
os_setup_post();
main_loop();
- quit_timers();
net_cleanup();
return 0;