qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [5635] Use qemu_set_fd_handler2() to determine when alarm t


From: Anthony Liguori
Subject: [Qemu-devel] [5635] Use qemu_set_fd_handler2() to determine when alarm timer fires.
Date: Wed, 05 Nov 2008 20:49:38 +0000

Revision: 5635
          http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=5635
Author:   aliguori
Date:     2008-11-05 20:49:37 +0000 (Wed, 05 Nov 2008)

Log Message:
-----------
Use qemu_set_fd_handler2() to determine when alarm timer fires.

Signed-off-by: Anthony Liguori <address@hidden>

Modified Paths:
--------------
    trunk/vl.c

Modified: trunk/vl.c
===================================================================
--- trunk/vl.c  2008-11-05 20:40:18 UTC (rev 5634)
+++ trunk/vl.c  2008-11-05 20:49:37 UTC (rev 5635)
@@ -1689,6 +1689,23 @@
 
 #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)
 {
     struct qemu_alarm_timer *t = NULL;
@@ -1723,9 +1740,12 @@
         goto fail;
     }
 
+    qemu_set_fd_handler2(alarm_timer_rfd, NULL,
+                         try_to_rearm_timer, NULL, t);
+
     alarm_timer = t;
 
-    return 1;
+    return 0;
 
 fail:
     close(fds[0]);
@@ -4467,9 +4487,8 @@
 
     /* poll any events */
     /* XXX: separate device handlers from system ones */
-    nfds = alarm_timer_rfd;
+    nfds = -1;
     FD_ZERO(&rfds);
-    FD_SET(alarm_timer_rfd, &rfds);
     FD_ZERO(&wfds);
     FD_ZERO(&xfds);
     for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
@@ -4542,16 +4561,6 @@
     qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
                     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
        them.  */
     qemu_bh_poll();






reply via email to

[Prev in Thread] Current Thread [Next in Thread]