summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/poll.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2007-12-13 10:57:08 +0000
committerCorinna Vinschen <corinna@vinschen.de>2007-12-13 10:57:08 +0000
commitd1f366883754347b7b2635bd5599cf8d5d331582 (patch)
treefddb6575f128f556f6e6978ea8f157b1a658da72 /winsup/cygwin/poll.cc
parent5642c35aae2e3c26724dae929c13bf09e3344078 (diff)
downloadcygnal-d1f366883754347b7b2635bd5599cf8d5d331582.tar.gz
cygnal-d1f366883754347b7b2635bd5599cf8d5d331582.tar.bz2
cygnal-d1f366883754347b7b2635bd5599cf8d5d331582.zip
* poll.cc (poll): Return count of fds with events instead of total
event count.
Diffstat (limited to 'winsup/cygwin/poll.cc')
-rw-r--r--winsup/cygwin/poll.cc85
1 files changed, 46 insertions, 39 deletions
diff --git a/winsup/cygwin/poll.cc b/winsup/cygwin/poll.cc
index 3be689c90..eda38ba5b 100644
--- a/winsup/cygwin/poll.cc
+++ b/winsup/cygwin/poll.cc
@@ -1,6 +1,6 @@
/* 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.
@@ -76,44 +76,51 @@ poll (struct pollfd *fds, nfds_t nfds, int timeout)
if (invalid_fds)
return invalid_fds;
- int ret = cygwin_select (max_fd + 1, read_fds, write_fds, except_fds, timeout < 0 ? NULL : &tv);
-
- if (ret > 0)
- for (unsigned int i = 0; i < nfds; ++i)
- {
- if (fds[i].fd >= 0)
- {
- if (cygheap->fdtab.not_open (fds[i].fd))
- fds[i].revents = POLLHUP;
- else
- {
- fhandler_socket *sock;
-
- if (FD_ISSET(fds[i].fd, read_fds))
- /* This should be sufficient for sockets, too. Using
- MSG_PEEK, as before, can be considered dangerous at
- best. Quote from W. Richard Stevens: "The presence
- of an error can be considered either normal data or
- an error (POLLERR). In either case, a subsequent read
- will return -1 with errno set to the appropriate value."
- So it looks like there's actually no good reason to
- return POLLERR. */
- fds[i].revents |= POLLIN;
- /* Handle failed connect. */
- if (FD_ISSET(fds[i].fd, write_fds)
- && (sock = cygheap->fdtab[fds[i].fd]->is_socket ())
- && sock->connect_state () == connect_failed)
- fds[i].revents |= (POLLIN | POLLERR);
- else
- {
- if (FD_ISSET(fds[i].fd, write_fds))
- fds[i].revents |= POLLOUT;
- if (FD_ISSET(fds[i].fd, except_fds))
- fds[i].revents |= POLLPRI;
- }
- }
- }
- }
+ int ret = cygwin_select (max_fd + 1, read_fds, write_fds, except_fds,
+ timeout < 0 ? NULL : &tv);
+ if (ret <= 0)
+ return ret;
+
+ /* Set revents fields and count fds with non-zero revents fields for
+ return value. */
+ ret = 0;
+ for (unsigned int i = 0; i < nfds; ++i)
+ {
+ if (fds[i].fd >= 0)
+ {
+ if (cygheap->fdtab.not_open (fds[i].fd))
+ fds[i].revents = POLLHUP;
+ else
+ {
+ fhandler_socket *sock;
+
+ if (FD_ISSET(fds[i].fd, read_fds))
+ /* This should be sufficient for sockets, too. Using
+ MSG_PEEK, as before, can be considered dangerous at
+ best. Quote from W. Richard Stevens: "The presence
+ of an error can be considered either normal data or
+ an error (POLLERR). In either case, a subsequent read
+ will return -1 with errno set to the appropriate value."
+ So it looks like there's actually no good reason to
+ return POLLERR. */
+ fds[i].revents |= POLLIN;
+ /* Handle failed connect. */
+ if (FD_ISSET(fds[i].fd, write_fds)
+ && (sock = cygheap->fdtab[fds[i].fd]->is_socket ())
+ && sock->connect_state () == connect_failed)
+ fds[i].revents |= (POLLIN | POLLERR);
+ else
+ {
+ if (FD_ISSET(fds[i].fd, write_fds))
+ fds[i].revents |= POLLOUT;
+ if (FD_ISSET(fds[i].fd, except_fds))
+ fds[i].revents |= POLLPRI;
+ }
+ }
+ if (fds[i].revents)
+ ++ret;
+ }
+ }
return ret;
}