mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-20 16:01:10 +08:00
* poll.cc (poll): Return count of fds with events instead of total
event count.
This commit is contained in:
parent
5642c35aae
commit
d1f3668837
@ -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>
|
||||
|
||||
* string.h: Guard cygwin internal string function definitions with
|
||||
|
@ -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);
|
||||
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)
|
||||
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;
|
||||
/* 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 (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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user