From: Stefan Hajnoczi Date: Thu, 16 May 2013 15:36:00 +0000 (+0200) Subject: main-loop: narrow win32 pollfds_fill() event bitmasks X-Git-Tag: v1.5.0-rc3~4 X-Git-Url: https://git.proxmox.com/?p=qemu.git;a=commitdiff_plain;h=8db165b36ef893ac69af0452f20eeb78e7b26b5a main-loop: narrow win32 pollfds_fill() event bitmasks pollfds_fill() and pollfds_poll() translate GPollFD to rfds/wfds/xfds for sockets on win32. select(2) is the underlying system call which is used to monitor sockets for activity. Currently file descriptors that monitor G_IO_ERR will be included in both rfds and wfds. As a result, select(2) will report writability on file descriptors where we only really wanted to monitor readability (with errors). slirp_pollfds_poll() hit this issue: UDP sockets are blocking sockets so we hang in sorecvfrom() when G_IO_ERR is set due to the socket being writable (we only wanted to check for readability). This patch fixes the slirp_pollfds_poll() hang. Signed-off-by: Stefan Hajnoczi Message-id: 1368718561-7816-2-git-send-email-stefanha@redhat.com Signed-off-by: Anthony Liguori --- diff --git a/main-loop.c b/main-loop.c index f46aece8b..2b8eed731 100644 --- a/main-loop.c +++ b/main-loop.c @@ -333,11 +333,11 @@ static int pollfds_fill(GArray *pollfds, fd_set *rfds, fd_set *wfds, GPollFD *pfd = &g_array_index(pollfds, GPollFD, i); int fd = pfd->fd; int events = pfd->events; - if (events & (G_IO_IN | G_IO_HUP | G_IO_ERR)) { + if (events & G_IO_IN) { FD_SET(fd, rfds); nfds = MAX(nfds, fd); } - if (events & (G_IO_OUT | G_IO_ERR)) { + if (events & G_IO_OUT) { FD_SET(fd, wfds); nfds = MAX(nfds, fd); } @@ -360,10 +360,10 @@ static void pollfds_poll(GArray *pollfds, int nfds, fd_set *rfds, int revents = 0; if (FD_ISSET(fd, rfds)) { - revents |= G_IO_IN | G_IO_HUP | G_IO_ERR; + revents |= G_IO_IN; } if (FD_ISSET(fd, wfds)) { - revents |= G_IO_OUT | G_IO_ERR; + revents |= G_IO_OUT; } if (FD_ISSET(fd, xfds)) { revents |= G_IO_PRI;