[vlc-devel] [PATCH 1/4] poll: only wait and call WSAEnumNetworkEvents() if select() reported nothing

Steve Lhomme robux4 at videolabs.io
Tue Dec 1 10:40:47 CET 2015


do the WSACloseEvent() afterwards for both cases
---
 compat/poll.c | 91 ++++++++++++++++++++++++++++++++---------------------------
 1 file changed, 50 insertions(+), 41 deletions(-)

diff --git a/compat/poll.c b/compat/poll.c
index fa94c93..e7351a4 100644
--- a/compat/poll.c
+++ b/compat/poll.c
@@ -190,55 +190,64 @@ int poll(struct pollfd *fds, unsigned nfds, int timeout)
             ret = WSA_WAIT_EVENT_0 + i;
     }
 
+    unsigned count = 0;
     if (ret == WSA_WAIT_FAILED)
+    {
         ret = WSAWaitForMultipleEvents(nfds, evts, FALSE, to, TRUE);
 
-    unsigned count = 0;
+        for (unsigned i = 0; i < nfds; i++)
+        {
+            WSANETWORKEVENTS ne;
+
+            if (WSAEnumNetworkEvents(fds[i].fd, evts[i], &ne))
+                memset(&ne, 0, sizeof (ne));
+
+            if (ne.lNetworkEvents & FD_CONNECT)
+            {
+                fds[i].revents |= POLLWRNORM;
+                if (ne.iErrorCode[FD_CONNECT_BIT] != 0)
+                    fds[i].revents |= POLLERR;
+            }
+            if (ne.lNetworkEvents & FD_CLOSE)
+            {
+                fds[i].revents |= (fds[i].events & POLLRDNORM) | POLLHUP;
+                if (ne.iErrorCode[FD_CLOSE_BIT] != 0)
+                    fds[i].revents |= POLLERR;
+            }
+            if (ne.lNetworkEvents & FD_ACCEPT)
+            {
+                fds[i].revents |= POLLRDNORM;
+                if (ne.iErrorCode[FD_ACCEPT_BIT] != 0)
+                    fds[i].revents |= POLLERR;
+            }
+            if (ne.lNetworkEvents & FD_OOB)
+            {
+                fds[i].revents |= POLLPRI;
+                if (ne.iErrorCode[FD_OOB_BIT] != 0)
+                    fds[i].revents |= POLLERR;
+            }
+            if (ne.lNetworkEvents & FD_READ)
+            {
+                fds[i].revents |= POLLRDNORM;
+                if (ne.iErrorCode[FD_READ_BIT] != 0)
+                    fds[i].revents |= POLLERR;
+            }
+            if (ne.lNetworkEvents & FD_WRITE)
+            {
+                fds[i].revents |= POLLWRNORM;
+                if (ne.iErrorCode[FD_WRITE_BIT] != 0)
+                    fds[i].revents |= POLLERR;
+            }
+        }
+    }
+
     for (unsigned i = 0; i < nfds; i++)
     {
-        WSANETWORKEVENTS ne;
-
-        if (WSAEnumNetworkEvents(fds[i].fd, evts[i], &ne))
-            memset(&ne, 0, sizeof (ne));
+        /* events already found with select */
+        /* unhook the event before we close it, otherwise the socket may fail */
         WSAEventSelect(fds[i].fd, evts[i], 0);
         WSACloseEvent(evts[i]);
 
-        if (ne.lNetworkEvents & FD_CONNECT)
-        {
-            fds[i].revents |= POLLWRNORM;
-            if (ne.iErrorCode[FD_CONNECT_BIT] != 0)
-                fds[i].revents |= POLLERR;
-        }
-        if (ne.lNetworkEvents & FD_CLOSE)
-        {
-            fds[i].revents |= (fds[i].events & POLLRDNORM) | POLLHUP;
-            if (ne.iErrorCode[FD_CLOSE_BIT] != 0)
-                fds[i].revents |= POLLERR;
-        }
-        if (ne.lNetworkEvents & FD_ACCEPT)
-        {
-            fds[i].revents |= POLLRDNORM;
-            if (ne.iErrorCode[FD_ACCEPT_BIT] != 0)
-                fds[i].revents |= POLLERR;
-        }
-        if (ne.lNetworkEvents & FD_OOB)
-        {
-            fds[i].revents |= POLLPRI;
-            if (ne.iErrorCode[FD_OOB_BIT] != 0)
-                fds[i].revents |= POLLERR;
-        }
-        if (ne.lNetworkEvents & FD_READ)
-        {
-            fds[i].revents |= POLLRDNORM;
-            if (ne.iErrorCode[FD_READ_BIT] != 0)
-                fds[i].revents |= POLLERR;
-        }
-        if (ne.lNetworkEvents & FD_WRITE)
-        {
-            fds[i].revents |= POLLWRNORM;
-            if (ne.iErrorCode[FD_WRITE_BIT] != 0)
-                fds[i].revents |= POLLERR;
-        }
         count += fds[i].revents != 0;
     }
 
-- 
2.6.3



More information about the vlc-devel mailing list