Commit 6abfbd79b242b9365dce3e3294289317c1a62c3b
1 parent
7183b4b4
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
Showing
1 changed file
with
22 additions
and
13 deletions
vl.c
| ... | ... | @@ -1689,6 +1689,23 @@ static void win32_rearm_timer(struct qemu_alarm_timer *t) |
| 1689 | 1689 | |
| 1690 | 1690 | #endif /* _WIN32 */ |
| 1691 | 1691 | |
| 1692 | +static void try_to_rearm_timer(void *opaque) | |
| 1693 | +{ | |
| 1694 | + struct qemu_alarm_timer *t = opaque; | |
| 1695 | + ssize_t len; | |
| 1696 | + | |
| 1697 | + /* Drain the notify pipe */ | |
| 1698 | + do { | |
| 1699 | + char buffer[512]; | |
| 1700 | + len = read(alarm_timer_rfd, buffer, sizeof(buffer)); | |
| 1701 | + } while ((len == -1 && errno == EINTR) || len > 0); | |
| 1702 | + | |
| 1703 | + if (t->flags & ALARM_FLAG_EXPIRED) { | |
| 1704 | + alarm_timer->flags &= ~ALARM_FLAG_EXPIRED; | |
| 1705 | + qemu_rearm_alarm_timer(alarm_timer); | |
| 1706 | + } | |
| 1707 | +} | |
| 1708 | + | |
| 1692 | 1709 | static int init_timer_alarm(void) |
| 1693 | 1710 | { |
| 1694 | 1711 | struct qemu_alarm_timer *t = NULL; |
| ... | ... | @@ -1723,9 +1740,12 @@ static int init_timer_alarm(void) |
| 1723 | 1740 | goto fail; |
| 1724 | 1741 | } |
| 1725 | 1742 | |
| 1743 | + qemu_set_fd_handler2(alarm_timer_rfd, NULL, | |
| 1744 | + try_to_rearm_timer, NULL, t); | |
| 1745 | + | |
| 1726 | 1746 | alarm_timer = t; |
| 1727 | 1747 | |
| 1728 | - return 1; | |
| 1748 | + return 0; | |
| 1729 | 1749 | |
| 1730 | 1750 | fail: |
| 1731 | 1751 | close(fds[0]); |
| ... | ... | @@ -4467,9 +4487,8 @@ void main_loop_wait(int timeout) |
| 4467 | 4487 | |
| 4468 | 4488 | /* poll any events */ |
| 4469 | 4489 | /* XXX: separate device handlers from system ones */ |
| 4470 | - nfds = alarm_timer_rfd; | |
| 4490 | + nfds = -1; | |
| 4471 | 4491 | FD_ZERO(&rfds); |
| 4472 | - FD_SET(alarm_timer_rfd, &rfds); | |
| 4473 | 4492 | FD_ZERO(&wfds); |
| 4474 | 4493 | FD_ZERO(&xfds); |
| 4475 | 4494 | for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) { |
| ... | ... | @@ -4542,16 +4561,6 @@ void main_loop_wait(int timeout) |
| 4542 | 4561 | qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME], |
| 4543 | 4562 | qemu_get_clock(rt_clock)); |
| 4544 | 4563 | |
| 4545 | - if (alarm_timer->flags & ALARM_FLAG_EXPIRED) { | |
| 4546 | - char byte; | |
| 4547 | - do { | |
| 4548 | - ret = read(alarm_timer_rfd, &byte, sizeof(byte)); | |
| 4549 | - } while (ret != -1 || errno != EAGAIN); | |
| 4550 | - | |
| 4551 | - alarm_timer->flags &= ~(ALARM_FLAG_EXPIRED); | |
| 4552 | - qemu_rearm_alarm_timer(alarm_timer); | |
| 4553 | - } | |
| 4554 | - | |
| 4555 | 4564 | /* Check bottom-halves last in case any of the earlier events triggered |
| 4556 | 4565 | them. */ |
| 4557 | 4566 | qemu_bh_poll(); | ... | ... |