* poll.cc (poll): Return count of fds with events instead of total

event count.
This commit is contained in:
Corinna Vinschen 2007-12-13 10:57:08 +00:00
parent 5642c35aae
commit d1f3668837
2 changed files with 50 additions and 37 deletions

View File

@ -1,3 +1,9 @@
2007-12-13 Craig MacGregor <cmacgreg@gmail.com>
Corinna Vinschen <corinna@vinschen.de>
* poll.cc (poll): Return count of fds with events instead of total
event count.
2007-12-13 Corinna Vinschen <corinna@vinschen.de> 2007-12-13 Corinna Vinschen <corinna@vinschen.de>
* string.h: Guard cygwin internal string function definitions with * string.h: Guard cygwin internal string function definitions with

View File

@ -1,6 +1,6 @@
/* poll.cc. Implements poll(2) via usage of select(2) call. /* poll.cc. Implements poll(2) via usage of select(2) call.
Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
This file is part of Cygwin. This file is part of Cygwin.
@ -76,44 +76,51 @@ poll (struct pollfd *fds, nfds_t nfds, int timeout)
if (invalid_fds) if (invalid_fds)
return invalid_fds; return invalid_fds;
int ret = cygwin_select (max_fd + 1, read_fds, write_fds, except_fds, timeout < 0 ? NULL : &tv); int ret = cygwin_select (max_fd + 1, read_fds, write_fds, except_fds,
timeout < 0 ? NULL : &tv);
if (ret <= 0)
return ret;
if (ret > 0) /* Set revents fields and count fds with non-zero revents fields for
for (unsigned int i = 0; i < nfds; ++i) return value. */
{ ret = 0;
if (fds[i].fd >= 0) for (unsigned int i = 0; i < nfds; ++i)
{ {
if (cygheap->fdtab.not_open (fds[i].fd)) if (fds[i].fd >= 0)
fds[i].revents = POLLHUP; {
else if (cygheap->fdtab.not_open (fds[i].fd))
{ fds[i].revents = POLLHUP;
fhandler_socket *sock; else
{
fhandler_socket *sock;
if (FD_ISSET(fds[i].fd, read_fds)) if (FD_ISSET(fds[i].fd, read_fds))
/* This should be sufficient for sockets, too. Using /* This should be sufficient for sockets, too. Using
MSG_PEEK, as before, can be considered dangerous at MSG_PEEK, as before, can be considered dangerous at
best. Quote from W. Richard Stevens: "The presence best. Quote from W. Richard Stevens: "The presence
of an error can be considered either normal data or of an error can be considered either normal data or
an error (POLLERR). In either case, a subsequent read an error (POLLERR). In either case, a subsequent read
will return -1 with errno set to the appropriate value." will return -1 with errno set to the appropriate value."
So it looks like there's actually no good reason to So it looks like there's actually no good reason to
return POLLERR. */ return POLLERR. */
fds[i].revents |= POLLIN; fds[i].revents |= POLLIN;
/* Handle failed connect. */ /* Handle failed connect. */
if (FD_ISSET(fds[i].fd, write_fds) if (FD_ISSET(fds[i].fd, write_fds)
&& (sock = cygheap->fdtab[fds[i].fd]->is_socket ()) && (sock = cygheap->fdtab[fds[i].fd]->is_socket ())
&& sock->connect_state () == connect_failed) && sock->connect_state () == connect_failed)
fds[i].revents |= (POLLIN | POLLERR); fds[i].revents |= (POLLIN | POLLERR);
else else
{ {
if (FD_ISSET(fds[i].fd, write_fds)) if (FD_ISSET(fds[i].fd, write_fds))
fds[i].revents |= POLLOUT; fds[i].revents |= POLLOUT;
if (FD_ISSET(fds[i].fd, except_fds)) if (FD_ISSET(fds[i].fd, except_fds))
fds[i].revents |= POLLPRI; fds[i].revents |= POLLPRI;
} }
} }
} if (fds[i].revents)
} ++ret;
}
}
return ret; return ret;
} }