From 6ea9c716565e12a05dc3e07b62d0c11c2dba6cda Mon Sep 17 00:00:00 2001
From: Corinna Vinschen <corinna@vinschen.de>
Date: Thu, 14 Mar 2002 12:15:31 +0000
Subject: [PATCH] 	* poll.cc: Remove variable open_fds, rearrange and add
 code 	to fix settings of revents.

---
 winsup/cygwin/ChangeLog |  5 +++
 winsup/cygwin/poll.cc   | 82 +++++++++++++++++++----------------------
 2 files changed, 42 insertions(+), 45 deletions(-)

diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 48804b6b1..f9f8d3bd1 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,8 @@
+2002-03-13  Boris Schaeling  <boriss@web.de>
+
+	* poll.cc: Remove variable open_fds, rearrange and add code
+	to fix settings of revents.
+
 2002-03-13  Corinna Vinschen  <corina@vinschen.de>
 
 	* mmap.cc (mmap_record::map_map): Return -1 if VirtualProtect fails.
diff --git a/winsup/cygwin/poll.cc b/winsup/cygwin/poll.cc
index 8b73c5afd..948f14c4b 100644
--- a/winsup/cygwin/poll.cc
+++ b/winsup/cygwin/poll.cc
@@ -26,7 +26,7 @@ int
 poll (struct pollfd *fds, unsigned int nfds, int timeout)
 {
   int max_fd = 0;
-  fd_set *open_fds, *read_fds, *write_fds, *except_fds;
+  fd_set *read_fds, *write_fds, *except_fds;
   struct timeval tv = { timeout / 1000, (timeout % 1000) * 1000 };
   sigframe thisframe (mainthread);
 
@@ -36,63 +36,55 @@ poll (struct pollfd *fds, unsigned int nfds, int timeout)
 
   size_t fds_size = howmany(max_fd + 1, NFDBITS) * sizeof (fd_mask);
 
-  open_fds = (fd_set *) alloca (fds_size);
   read_fds = (fd_set *) alloca (fds_size);
   write_fds = (fd_set *) alloca (fds_size);
   except_fds = (fd_set *) alloca (fds_size);
 
-  if (!open_fds || !read_fds || !write_fds || !except_fds)
+  if (!read_fds || !write_fds || !except_fds)
     {
       set_errno (ENOMEM);
       return -1;
     }
 
-  memset (open_fds, 0, fds_size);
   memset (read_fds, 0, fds_size);
   memset (write_fds, 0, fds_size);
   memset (except_fds, 0, fds_size);
 
-  bool valid_fds = false;
-  for (unsigned int i = 0; i < nfds; ++i)
-    if (!cygheap->fdtab.not_open (fds[i].fd))
-      {
-	valid_fds = true;
-	fds[i].revents = 0;
-	FD_SET (fds[i].fd, open_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
-	fds[i].revents = POLLNVAL;
+  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); 
+	} 
+    } 
 
-  int ret = 0;
-  if (valid_fds)
-    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);
 
-  for (unsigned int i = 0; i < nfds; ++i)
-    {
-      if (fds[i].revents == POLLNVAL && ret >= 0)
-	ret++;
-      else if (cygheap->fdtab.not_open(fds[i].fd))
-	fds[i].revents = POLLHUP;
-      else if (ret < 0)
-	fds[i].revents = POLLERR;
-      else
-	{
-	  fds[i].revents = 0;
-	  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, except_fds))
-	    fds[i].revents |= POLLPRI;
-	}
-    }
+  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; 
+	  } 
+      } 
 
-  return ret;
-}
+  return ret; 
+}