* 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>
|
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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user