From 0a165d09ccd3b1686bd5d29d1a0a58926776b993 Mon Sep 17 00:00:00 2001 From: Liu Ping Fan Date: Sun, 25 Aug 2013 10:01:21 +0800 Subject: slirp: set mainloop timeout with more precise value If slirp needs to emulate tcp timeout, then the timeout value for mainloop should be more precise, which is determined by slirp's fasttimo or slowtimo. Achieve this by swap the logic sequence of slirp_pollfds_fill and slirp_update_timeout. Signed-off-by: Liu Ping Fan Signed-off-by: Jan Kiszka --- slirp.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'slirp.c') diff --git a/slirp.c b/slirp.c index dc3e4a1..8eb5a35 100644 --- a/slirp.c +++ b/slirp.c @@ -263,14 +263,33 @@ void slirp_cleanup(Slirp *slirp) #define CONN_CANFRCV(so) \ (((so)->so_state & (SS_FCANTRCVMORE | SS_ISFCONNECTED)) == SS_ISFCONNECTED) -void slirp_update_timeout(uint32_t *timeout) +static void slirp_update_timeout(uint32_t *timeout) { - if (!QTAILQ_EMPTY(&slirp_instances)) { - *timeout = MIN(TIMEOUT_DEFAULT, *timeout); + Slirp *slirp; + uint32_t t; + + if (*timeout <= TIMEOUT_FAST) { + return; + } + *timeout = MIN(1000, *timeout); + t = *timeout; + + /* If we have tcp timeout with slirp, then we will fill @timeout with + * more precise value. + */ + QTAILQ_FOREACH (slirp, &slirp_instances, entry) { + if (slirp->time_fasttimo) { + *timeout = TIMEOUT_FAST; + return; + } + if (slirp->do_slowtimo) { + t = MIN(TIMEOUT_SLOW, t); + } } + *timeout = t; } -void slirp_pollfds_fill(GArray *pollfds) +void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout) { Slirp *slirp; struct socket *so, *so_next; @@ -437,6 +456,7 @@ void slirp_pollfds_fill(GArray *pollfds) } } } + slirp_update_timeout(timeout); } void slirp_pollfds_poll(GArray *pollfds, int select_error) -- cgit v1.1