Commit 6abfbd79b242b9365dce3e3294289317c1a62c3b

Authored by aliguori
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
@@ -1689,6 +1689,23 @@ static void win32_rearm_timer(struct qemu_alarm_timer *t) @@ -1689,6 +1689,23 @@ static void win32_rearm_timer(struct qemu_alarm_timer *t)
1689 1689
1690 #endif /* _WIN32 */ 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 static int init_timer_alarm(void) 1709 static int init_timer_alarm(void)
1693 { 1710 {
1694 struct qemu_alarm_timer *t = NULL; 1711 struct qemu_alarm_timer *t = NULL;
@@ -1723,9 +1740,12 @@ static int init_timer_alarm(void) @@ -1723,9 +1740,12 @@ static int init_timer_alarm(void)
1723 goto fail; 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 alarm_timer = t; 1746 alarm_timer = t;
1727 1747
1728 - return 1; 1748 + return 0;
1729 1749
1730 fail: 1750 fail:
1731 close(fds[0]); 1751 close(fds[0]);
@@ -4467,9 +4487,8 @@ void main_loop_wait(int timeout) @@ -4467,9 +4487,8 @@ void main_loop_wait(int timeout)
4467 4487
4468 /* poll any events */ 4488 /* poll any events */
4469 /* XXX: separate device handlers from system ones */ 4489 /* XXX: separate device handlers from system ones */
4470 - nfds = alarm_timer_rfd; 4490 + nfds = -1;
4471 FD_ZERO(&rfds); 4491 FD_ZERO(&rfds);
4472 - FD_SET(alarm_timer_rfd, &rfds);  
4473 FD_ZERO(&wfds); 4492 FD_ZERO(&wfds);
4474 FD_ZERO(&xfds); 4493 FD_ZERO(&xfds);
4475 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) { 4494 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
@@ -4542,16 +4561,6 @@ void main_loop_wait(int timeout) @@ -4542,16 +4561,6 @@ void main_loop_wait(int timeout)
4542 qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME], 4561 qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
4543 qemu_get_clock(rt_clock)); 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 /* Check bottom-halves last in case any of the earlier events triggered 4564 /* Check bottom-halves last in case any of the earlier events triggered
4556 them. */ 4565 them. */
4557 qemu_bh_poll(); 4566 qemu_bh_poll();