compat: poll: work around event loss on WIN32
authorThomas Guillem <thomas@gllm.fr>
Thu, 22 Feb 2018 09:15:17 +0000 (10:15 +0100)
committerThomas Guillem <thomas@gllm.fr>
Thu, 22 Feb 2018 10:59:01 +0000 (11:59 +0100)
Signed-off-by: Steve Lhomme <robux4@videolabs.io>
Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
compat/poll.c

index fa94c93..8020f7d 100644 (file)
@@ -109,7 +109,7 @@ int (poll) (struct pollfd *fds, unsigned nfds, int timeout)
 # include <windows.h>
 # include <winsock2.h>
 
-int poll(struct pollfd *fds, unsigned nfds, int timeout)
+static int poll_compat(struct pollfd *fds, unsigned nfds, int timeout)
 {
     DWORD to = (timeout >= 0) ? (DWORD)timeout : INFINITE;
 
@@ -251,4 +251,21 @@ int poll(struct pollfd *fds, unsigned nfds, int timeout)
     }
     return count;
 }
+
+int poll(struct pollfd *fds, unsigned nfds, int timeout)
+{
+    if (timeout == -1)
+    {
+        /* HACK: In some cases, we lose some events because events are
+         * destroyed and recreated only when we need to poll. In order to work
+         * arround this issue, we try to call the poll compat function every
+         * 100ms (in case of infinite timeout). */
+        int ret;
+        while ((ret = poll_compat(fds, nfds, 100)) == 0);
+        return ret;
+    }
+    else
+        return poll_compat(fds, nfds, timeout);
+}
+
 #endif