mirror of https://github.com/xqemu/xqemu.git
Use qemu_set_fd_handler2() to determine when alarm timer fires.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5635 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
7183b4b47a
commit
6abfbd79b2
35
vl.c
35
vl.c
|
@ -1689,6 +1689,23 @@ static void win32_rearm_timer(struct qemu_alarm_timer *t)
|
||||||
|
|
||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
|
static void try_to_rearm_timer(void *opaque)
|
||||||
|
{
|
||||||
|
struct qemu_alarm_timer *t = opaque;
|
||||||
|
ssize_t len;
|
||||||
|
|
||||||
|
/* Drain the notify pipe */
|
||||||
|
do {
|
||||||
|
char buffer[512];
|
||||||
|
len = read(alarm_timer_rfd, buffer, sizeof(buffer));
|
||||||
|
} while ((len == -1 && errno == EINTR) || len > 0);
|
||||||
|
|
||||||
|
if (t->flags & ALARM_FLAG_EXPIRED) {
|
||||||
|
alarm_timer->flags &= ~ALARM_FLAG_EXPIRED;
|
||||||
|
qemu_rearm_alarm_timer(alarm_timer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int init_timer_alarm(void)
|
static int init_timer_alarm(void)
|
||||||
{
|
{
|
||||||
struct qemu_alarm_timer *t = NULL;
|
struct qemu_alarm_timer *t = NULL;
|
||||||
|
@ -1723,9 +1740,12 @@ static int init_timer_alarm(void)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qemu_set_fd_handler2(alarm_timer_rfd, NULL,
|
||||||
|
try_to_rearm_timer, NULL, t);
|
||||||
|
|
||||||
alarm_timer = t;
|
alarm_timer = t;
|
||||||
|
|
||||||
return 1;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
close(fds[0]);
|
close(fds[0]);
|
||||||
|
@ -4467,9 +4487,8 @@ void main_loop_wait(int timeout)
|
||||||
|
|
||||||
/* poll any events */
|
/* poll any events */
|
||||||
/* XXX: separate device handlers from system ones */
|
/* XXX: separate device handlers from system ones */
|
||||||
nfds = alarm_timer_rfd;
|
nfds = -1;
|
||||||
FD_ZERO(&rfds);
|
FD_ZERO(&rfds);
|
||||||
FD_SET(alarm_timer_rfd, &rfds);
|
|
||||||
FD_ZERO(&wfds);
|
FD_ZERO(&wfds);
|
||||||
FD_ZERO(&xfds);
|
FD_ZERO(&xfds);
|
||||||
for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
|
for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
|
||||||
|
@ -4542,16 +4561,6 @@ void main_loop_wait(int timeout)
|
||||||
qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
|
qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
|
||||||
qemu_get_clock(rt_clock));
|
qemu_get_clock(rt_clock));
|
||||||
|
|
||||||
if (alarm_timer->flags & ALARM_FLAG_EXPIRED) {
|
|
||||||
char byte;
|
|
||||||
do {
|
|
||||||
ret = read(alarm_timer_rfd, &byte, sizeof(byte));
|
|
||||||
} while (ret != -1 || errno != EAGAIN);
|
|
||||||
|
|
||||||
alarm_timer->flags &= ~(ALARM_FLAG_EXPIRED);
|
|
||||||
qemu_rearm_alarm_timer(alarm_timer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check bottom-halves last in case any of the earlier events triggered
|
/* Check bottom-halves last in case any of the earlier events triggered
|
||||||
them. */
|
them. */
|
||||||
qemu_bh_poll();
|
qemu_bh_poll();
|
||||||
|
|
Loading…
Reference in New Issue