mirror of https://gitlab.com/qemu-project/qemu
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 <stefanha@redhat.com> Message-id: 1368718561-7816-2-git-send-email-stefanha@redhat.com Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
6d46895b51
commit
8db165b36e
|
@ -333,11 +333,11 @@ static int pollfds_fill(GArray *pollfds, fd_set *rfds, fd_set *wfds,
|
||||||
GPollFD *pfd = &g_array_index(pollfds, GPollFD, i);
|
GPollFD *pfd = &g_array_index(pollfds, GPollFD, i);
|
||||||
int fd = pfd->fd;
|
int fd = pfd->fd;
|
||||||
int events = pfd->events;
|
int events = pfd->events;
|
||||||
if (events & (G_IO_IN | G_IO_HUP | G_IO_ERR)) {
|
if (events & G_IO_IN) {
|
||||||
FD_SET(fd, rfds);
|
FD_SET(fd, rfds);
|
||||||
nfds = MAX(nfds, fd);
|
nfds = MAX(nfds, fd);
|
||||||
}
|
}
|
||||||
if (events & (G_IO_OUT | G_IO_ERR)) {
|
if (events & G_IO_OUT) {
|
||||||
FD_SET(fd, wfds);
|
FD_SET(fd, wfds);
|
||||||
nfds = MAX(nfds, fd);
|
nfds = MAX(nfds, fd);
|
||||||
}
|
}
|
||||||
|
@ -360,10 +360,10 @@ static void pollfds_poll(GArray *pollfds, int nfds, fd_set *rfds,
|
||||||
int revents = 0;
|
int revents = 0;
|
||||||
|
|
||||||
if (FD_ISSET(fd, rfds)) {
|
if (FD_ISSET(fd, rfds)) {
|
||||||
revents |= G_IO_IN | G_IO_HUP | G_IO_ERR;
|
revents |= G_IO_IN;
|
||||||
}
|
}
|
||||||
if (FD_ISSET(fd, wfds)) {
|
if (FD_ISSET(fd, wfds)) {
|
||||||
revents |= G_IO_OUT | G_IO_ERR;
|
revents |= G_IO_OUT;
|
||||||
}
|
}
|
||||||
if (FD_ISSET(fd, xfds)) {
|
if (FD_ISSET(fd, xfds)) {
|
||||||
revents |= G_IO_PRI;
|
revents |= G_IO_PRI;
|
||||||
|
|
Loading…
Reference in New Issue