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>
This commit is contained in:
Stefano Stabellini 2012-04-13 19:35:04 +01:00 committed by Anthony Liguori
parent 4ffd16fc29
commit 7c7db75576
8 changed files with 28 additions and 17 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

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

View File

@ -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);

View File

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

View File

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

View File

@ -258,6 +258,13 @@ void slirp_cleanup(Slirp *slirp)
#define CONN_CANFRCV(so) (((so)->so_state & (SS_FCANTRCVMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
#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,
fd_set *readfds, fd_set *writefds, fd_set *xfds)
{