ソースを参照

main_loop_wait: block indefinitely

- remove qemu_calculate_timeout;

- explicitly size timeout to uint32_t;

- introduce slirp_update_timeout;

- pass NULL as timeout argument to select in case timeout is the maximum
value;

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Acked-by: Paul Brook <paul@codesourcery.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Stefano Stabellini 13 年 前
コミット
7c7db75576
8 ファイル変更28 行追加17 行削除
  1. 1 1
      async.c
  2. 14 9
      main-loop.c
  3. 1 1
      main-loop.h
  4. 0 5
      qemu-timer.c
  5. 0 1
      qemu-timer.h
  6. 4 0
      qemu-tool.c
  7. 1 0
      slirp/libslirp.h
  8. 7 0
      slirp/slirp.c

+ 1 - 1
async.c

@@ -120,7 +120,7 @@ void qemu_bh_delete(QEMUBH *bh)
     bh->deleted = 1;
     bh->deleted = 1;
 }
 }
 
 
-void qemu_bh_update_timeout(int *timeout)
+void qemu_bh_update_timeout(uint32_t *timeout)
 {
 {
     QEMUBH *bh;
     QEMUBH *bh;
 
 

+ 14 - 9
main-loop.c

@@ -226,7 +226,7 @@ static int max_priority;
 
 
 #ifndef _WIN32
 #ifndef _WIN32
 static void glib_select_fill(int *max_fd, fd_set *rfds, fd_set *wfds,
 static void glib_select_fill(int *max_fd, fd_set *rfds, fd_set *wfds,
-                             fd_set *xfds, int *cur_timeout)
+                             fd_set *xfds, uint32_t *cur_timeout)
 {
 {
     GMainContext *context = g_main_context_default();
     GMainContext *context = g_main_context_default();
     int i;
     int i;
@@ -288,20 +288,24 @@ static void glib_select_poll(fd_set *rfds, fd_set *wfds, fd_set *xfds,
     }
     }
 }
 }
 
 
-static int os_host_main_loop_wait(int timeout)
+static int os_host_main_loop_wait(uint32_t timeout)
 {
 {
-    struct timeval tv;
+    struct timeval tv, *tvarg = NULL;
     int ret;
     int ret;
 
 
     glib_select_fill(&nfds, &rfds, &wfds, &xfds, &timeout);
     glib_select_fill(&nfds, &rfds, &wfds, &xfds, &timeout);
 
 
+    if (timeout < UINT32_MAX) {
+        tvarg = &tv;
+        tv.tv_sec = timeout / 1000;
+        tv.tv_usec = (timeout % 1000) * 1000;
+    }
+
     if (timeout > 0) {
     if (timeout > 0) {
         qemu_mutex_unlock_iothread();
         qemu_mutex_unlock_iothread();
     }
     }
 
 
-    tv.tv_sec = timeout / 1000;
-    tv.tv_usec = (timeout % 1000) * 1000;
-    ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
+    ret = select(nfds + 1, &rfds, &wfds, &xfds, tvarg);
 
 
     if (timeout > 0) {
     if (timeout > 0) {
         qemu_mutex_lock_iothread();
         qemu_mutex_lock_iothread();
@@ -400,7 +404,7 @@ void qemu_fd_register(int fd)
                    FD_CONNECT | FD_WRITE | FD_OOB);
                    FD_CONNECT | FD_WRITE | FD_OOB);
 }
 }
 
 
-static int os_host_main_loop_wait(int timeout)
+static int os_host_main_loop_wait(uint32_t timeout)
 {
 {
     GMainContext *context = g_main_context_default();
     GMainContext *context = g_main_context_default();
     int ret, i;
     int ret, i;
@@ -463,12 +467,12 @@ static int os_host_main_loop_wait(int timeout)
 
 
 int main_loop_wait(int nonblocking)
 int main_loop_wait(int nonblocking)
 {
 {
-    int ret, timeout;
+    int ret;
+    uint32_t timeout = UINT32_MAX;
 
 
     if (nonblocking) {
     if (nonblocking) {
         timeout = 0;
         timeout = 0;
     } else {
     } else {
-        timeout = qemu_calculate_timeout();
         qemu_bh_update_timeout(&timeout);
         qemu_bh_update_timeout(&timeout);
     }
     }
 
 
@@ -480,6 +484,7 @@ int main_loop_wait(int nonblocking)
     FD_ZERO(&xfds);
     FD_ZERO(&xfds);
 
 
 #ifdef CONFIG_SLIRP
 #ifdef CONFIG_SLIRP
+    slirp_update_timeout(&timeout);
     slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
     slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
 #endif
 #endif
     qemu_iohandler_fill(&nfds, &rfds, &wfds, &xfds);
     qemu_iohandler_fill(&nfds, &rfds, &wfds, &xfds);

+ 1 - 1
main-loop.h

@@ -365,6 +365,6 @@ void qemu_iohandler_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds, int rc
 
 
 void qemu_bh_schedule_idle(QEMUBH *bh);
 void qemu_bh_schedule_idle(QEMUBH *bh);
 int qemu_bh_poll(void);
 int qemu_bh_poll(void);
-void qemu_bh_update_timeout(int *timeout);
+void qemu_bh_update_timeout(uint32_t *timeout);
 
 
 #endif
 #endif

+ 0 - 5
qemu-timer.c

@@ -821,8 +821,3 @@ fail:
     return err;
     return err;
 }
 }
 
 
-int qemu_calculate_timeout(void)
-{
-    return 1000;
-}
-

+ 0 - 1
qemu-timer.h

@@ -63,7 +63,6 @@ void qemu_run_timers(QEMUClock *clock);
 void qemu_run_all_timers(void);
 void qemu_run_all_timers(void);
 int qemu_alarm_pending(void);
 int qemu_alarm_pending(void);
 void configure_alarms(char const *opt);
 void configure_alarms(char const *opt);
-int qemu_calculate_timeout(void);
 void init_clocks(void);
 void init_clocks(void);
 int init_timer_alarm(void);
 int init_timer_alarm(void);
 
 

+ 4 - 0
qemu-tool.c

@@ -90,6 +90,10 @@ int qemu_init_main_loop(void)
     return main_loop_init();
     return main_loop_init();
 }
 }
 
 
+void slirp_update_timeout(uint32_t *timeout)
+{
+}
+
 void slirp_select_fill(int *pnfds, fd_set *readfds,
 void slirp_select_fill(int *pnfds, fd_set *readfds,
                        fd_set *writefds, fd_set *xfds)
                        fd_set *writefds, fd_set *xfds)
 {
 {

+ 1 - 0
slirp/libslirp.h

@@ -15,6 +15,7 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork,
                   struct in_addr vnameserver, void *opaque);
                   struct in_addr vnameserver, void *opaque);
 void slirp_cleanup(Slirp *slirp);
 void slirp_cleanup(Slirp *slirp);
 
 
+void slirp_update_timeout(uint32_t *timeout);
 void slirp_select_fill(int *pnfds,
 void slirp_select_fill(int *pnfds,
                        fd_set *readfds, fd_set *writefds, fd_set *xfds);
                        fd_set *readfds, fd_set *writefds, fd_set *xfds);
 
 

+ 7 - 0
slirp/slirp.c

@@ -258,6 +258,13 @@ void slirp_cleanup(Slirp *slirp)
 #define CONN_CANFRCV(so) (((so)->so_state & (SS_FCANTRCVMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
 #define CONN_CANFRCV(so) (((so)->so_state & (SS_FCANTRCVMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
 #define UPD_NFDS(x) if (nfds < (x)) nfds = (x)
 #define UPD_NFDS(x) if (nfds < (x)) nfds = (x)
 
 
+void slirp_update_timeout(uint32_t *timeout)
+{
+    if (!QTAILQ_EMPTY(&slirp_instances)) {
+        *timeout = MIN(1000, *timeout);
+    }
+}
+
 void slirp_select_fill(int *pnfds,
 void slirp_select_fill(int *pnfds,
                        fd_set *readfds, fd_set *writefds, fd_set *xfds)
                        fd_set *readfds, fd_set *writefds, fd_set *xfds)
 {
 {