Commit 7c7db755 authored by Stefano Stabellini's avatar Stefano Stabellini Committed by Anthony Liguori
Browse files

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: default avatarStefano Stabellini <stefano.stabellini@eu.citrix.com>
Acked-by: default avatarPaul Brook <paul@codesourcery.com>
Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
parent 4ffd16fc
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -120,7 +120,7 @@ void qemu_bh_delete(QEMUBH *bh)
    bh->deleted = 1;
}

void qemu_bh_update_timeout(int *timeout)
void qemu_bh_update_timeout(uint32_t *timeout)
{
    QEMUBH *bh;

+14 −9
Original line number Diff line number Diff line
@@ -226,7 +226,7 @@ static int max_priority;

#ifndef _WIN32
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();
    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;

    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) {
        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) {
        qemu_mutex_lock_iothread();
@@ -400,7 +404,7 @@ void qemu_fd_register(int fd)
                   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();
    int ret, i;
@@ -463,12 +467,12 @@ static int os_host_main_loop_wait(int timeout)

int main_loop_wait(int nonblocking)
{
    int ret, timeout;
    int ret;
    uint32_t timeout = UINT32_MAX;

    if (nonblocking) {
        timeout = 0;
    } else {
        timeout = qemu_calculate_timeout();
        qemu_bh_update_timeout(&timeout);
    }

@@ -480,6 +484,7 @@ int main_loop_wait(int nonblocking)
    FD_ZERO(&xfds);

#ifdef CONFIG_SLIRP
    slirp_update_timeout(&timeout);
    slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
#endif
    qemu_iohandler_fill(&nfds, &rfds, &wfds, &xfds);
+1 −1
Original line number Diff line number Diff line
@@ -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);
int qemu_bh_poll(void);
void qemu_bh_update_timeout(int *timeout);
void qemu_bh_update_timeout(uint32_t *timeout);

#endif
+0 −5
Original line number Diff line number Diff line
@@ -821,8 +821,3 @@ fail:
    return err;
}
int qemu_calculate_timeout(void)
{
    return 1000;
}
+0 −1
Original line number Diff line number Diff line
@@ -63,7 +63,6 @@ void qemu_run_timers(QEMUClock *clock);
void qemu_run_all_timers(void);
int qemu_alarm_pending(void);
void configure_alarms(char const *opt);
int qemu_calculate_timeout(void);
void init_clocks(void);
int init_timer_alarm(void);

Loading