* poll.cc (poll): Add support for invalid descriptors.

This commit is contained in:
Corinna Vinschen 2002-03-19 17:12:49 +00:00
parent 7a9f3efb1b
commit 99dbafacb6
2 changed files with 39 additions and 25 deletions

View File

@ -1,3 +1,7 @@
2002-03-19 Boris Schaeling <boriss@web.de>
* poll.cc (poll): Add support for invalid descriptors.
2002-03-15 Robert Collins <rbtcollins@hotmail.com>
* fhandler.h (fhandler_termios::lseek): Override lseek.

View File

@ -50,41 +50,51 @@ poll (struct pollfd *fds, unsigned int nfds, int timeout)
memset (write_fds, 0, fds_size);
memset (except_fds, 0, fds_size);
int invalid_fds = 0;
for (unsigned int i = 0; i < nfds; ++i)
{
fds[i].revents = 0;
if (!cygheap->fdtab.not_open(fds[i].fd))
{
if (fds[i].events & POLLIN)
FD_SET(fds[i].fd, read_fds);
if (fds[i].events & POLLOUT)
FD_SET(fds[i].fd, write_fds);
if (fds[i].events & POLLPRI)
FD_SET(fds[i].fd, except_fds);
}
{
if (fds[i].events & POLLIN)
FD_SET(fds[i].fd, read_fds);
if (fds[i].events & POLLOUT)
FD_SET(fds[i].fd, write_fds);
if (fds[i].events & POLLPRI)
FD_SET(fds[i].fd, except_fds);
}
else if (fds[i].fd >= 0)
{
++invalid_fds;
fds[i].revents = POLLNVAL;
}
}
int ret = cygwin_select (max_fd + 1, read_fds, write_fds, except_fds, timeout < 0 ? NULL : &tv);
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)
fds[i].revents = POLLNVAL;
else if (cygheap->fdtab.not_open(fds[i].fd))
fds[i].revents = POLLHUP;
else
{
if (FD_ISSET(fds[i].fd, read_fds))
fds[i].revents |= POLLIN;
if (FD_ISSET(fds[i].fd, write_fds))
fds[i].revents |= POLLOUT;
if (FD_ISSET(fds[i].fd, read_fds) && FD_ISSET(fds[i].fd, write_fds))
fds[i].revents |= POLLERR;
if (FD_ISSET(fds[i].fd, except_fds))
fds[i].revents |= POLLPRI;
}
if (fds[i].fd >= 0)
{
if (cygheap->fdtab.not_open(fds[i].fd))
fds[i].revents = POLLHUP;
else
{
if (FD_ISSET(fds[i].fd, read_fds))
fds[i].revents |= POLLIN;
if (FD_ISSET(fds[i].fd, write_fds))
fds[i].revents |= POLLOUT;
if (FD_ISSET(fds[i].fd, read_fds) && FD_ISSET(fds[i].fd, write_fds))
fds[i].revents |= POLLERR;
if (FD_ISSET(fds[i].fd, except_fds))
fds[i].revents |= POLLPRI;
}
}
}
return ret;
}
}