@@ -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,12 @@ 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 +1035,7 @@ static void win32_rearm_timer(struct qemu_alarm_timer
*t)
GetLastError());
timeEndPeriod(data->period);
+ data->period = 0;
exit(1);
}
}
@@ -1061,6 +1070,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;
This patch fixes resource leaks caused by quitting qemu with exit() function on win32 host. Timer object should be freed not only at the end of the main function, but by every of the application exits. Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@gmail.com> --- qemu-timer.c | 16 +++++++++++++--- vl.c | 1 - 2 files changed, 13 insertions(+), 4 deletions(-)