Commit 4dae83ae authored by Paolo Bonzini's avatar Paolo Bonzini Committed by Blue Swirl
Browse files

main loop: use msec-based timeout in glib_select_fill



The timeval-based timeout is not needed until we actually invoke select,
so compute it only then.  Also group the two calls that modify the
timeout, glib_select_fill and os_host_main_loop_wait.

Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarBlue Swirl <blauwirbel@gmail.com>
parent ab7ab3d7
Loading
Loading
Loading
Loading
+10 −12
Original line number Diff line number Diff line
@@ -224,11 +224,11 @@ static int n_poll_fds;
static int max_priority;

static void glib_select_fill(int *max_fd, fd_set *rfds, fd_set *wfds,
                             fd_set *xfds, struct timeval *tv)
                             fd_set *xfds, int *cur_timeout)
{
    GMainContext *context = g_main_context_default();
    int i;
    int timeout = 0, cur_timeout;
    int timeout = 0;

    g_main_context_prepare(context, &max_priority);

@@ -253,10 +253,8 @@ static void glib_select_fill(int *max_fd, fd_set *rfds, fd_set *wfds,
        }
    }

    cur_timeout = (tv->tv_sec * 1000) + ((tv->tv_usec + 500) / 1000);
    if (timeout >= 0 && timeout < cur_timeout) {
        tv->tv_sec = timeout / 1000;
        tv->tv_usec = (timeout % 1000) * 1000;
    if (timeout >= 0 && timeout < *cur_timeout) {
        *cur_timeout = timeout;
    }
}

@@ -432,11 +430,6 @@ int main_loop_wait(int nonblocking)
        qemu_bh_update_timeout(&timeout);
    }

    os_host_main_loop_wait(&timeout);

    tv.tv_sec = timeout / 1000;
    tv.tv_usec = (timeout % 1000) * 1000;

    /* poll any events */
    /* XXX: separate device handlers from system ones */
    nfds = -1;
@@ -448,7 +441,12 @@ int main_loop_wait(int nonblocking)
    slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
#endif
    qemu_iohandler_fill(&nfds, &rfds, &wfds, &xfds);
    glib_select_fill(&nfds, &rfds, &wfds, &xfds, &tv);

    glib_select_fill(&nfds, &rfds, &wfds, &xfds, &timeout);
    os_host_main_loop_wait(&timeout);

    tv.tv_sec = timeout / 1000;
    tv.tv_usec = (timeout % 1000) * 1000;

    if (timeout > 0) {
        qemu_mutex_unlock_iothread();