mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 18:23:57 -06:00
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 <pingfank@linux.vnet.ibm.com> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
This commit is contained in:
parent
9b0ca6cc64
commit
a42e9c4188
4 changed files with 27 additions and 13 deletions
|
@ -16,8 +16,7 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork,
|
|||
void *opaque);
|
||||
void slirp_cleanup(Slirp *slirp);
|
||||
|
||||
void slirp_update_timeout(uint32_t *timeout);
|
||||
void slirp_pollfds_fill(GArray *pollfds);
|
||||
void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout);
|
||||
|
||||
void slirp_pollfds_poll(GArray *pollfds, int select_error);
|
||||
|
||||
|
|
|
@ -262,14 +262,33 @@ void slirp_cleanup(Slirp *slirp)
|
|||
#define CONN_CANFSEND(so) (((so)->so_state & (SS_FCANTSENDMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
|
||||
#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;
|
||||
|
@ -439,6 +458,7 @@ void slirp_pollfds_fill(GArray *pollfds)
|
|||
}
|
||||
}
|
||||
}
|
||||
slirp_update_timeout(timeout);
|
||||
}
|
||||
|
||||
void slirp_pollfds_poll(GArray *pollfds, int select_error)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue