]> git.sesse.net Git - vlc/blobdiff - src/network/poll.c
Maemo: work-around segmentation fault when poll() unwinds
[vlc] / src / network / poll.c
index 553a7e59d72fa1a4dc8142a2d4c10b6a6993ff4e..eb97c83db07749449b3dfac987ff927a6bf089fe 100644 (file)
 # include "config.h"
 #endif
 
-#ifdef HAVE_POLL
+#include <vlc_common.h>
 #include <stdlib.h>
+#include <vlc_network.h>
+
+
+#if HAVE_MAEMO
+# include <signal.h>
+# include <errno.h>
+# include <poll.h>
+
+int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout)
+{
+    struct timespec tsbuf, *ts;
+    sigset_t set;
+    int canc, ret;
+
+    if (timeout != -1)
+    {
+        div_t d = div (timeout, 1000);
+        tsbuf.tv_sec = d.quot;
+        tsbuf.tv_nsec = d.rem * 1000000;
+        ts = &tsbuf;
+    }
+    else
+        ts = NULL;
+
+    pthread_sigmask (SIG_BLOCK, NULL, &set);
+    sigdelset (&set, SIGRTMIN);
+
+    canc = vlc_savecancel ();
+    ret = ppoll (fds, nfds, ts, &set);
+    vlc_restorecancel (canc);
 
+    vlc_testcancel ();
+    return ret;
+}
+
+#elif defined (HAVE_POLL)
 struct pollfd;
 
 int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout)
@@ -37,16 +72,17 @@ int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout)
 }
 #else /* !HAVE_POLL */
 
-#include <vlc_common.h>
 #include <string.h>
-#include <stdlib.h>
-#include <vlc_network.h>
 
 int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout)
 {
     fd_set rdset, wrset, exset;
     struct timeval tv = { 0, 0 };
-    int val = -1;
+    int val;
+
+resume:
+    val = -1;
+    vlc_testcancel ();
 
     FD_ZERO (&rdset);
     FD_ZERO (&wrset);
@@ -87,13 +123,10 @@ int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout)
 
 #ifndef HAVE_ALERTABLE_SELECT
 # warning FIXME! Fix cancellation and remove this crap.
-resume:
-    vlc_testcancel ();
-
     if ((timeout < 0) || (timeout > 50))
     {
         tv.tv_sec = 0;
-        tv.tv_usec = 50;
+        tv.tv_usec = 50000;
     }
     else
 #endif
@@ -105,10 +138,9 @@ resume:
     }
 
     val = select (val + 1, &rdset, &wrset, &exset,
-                  (timeout >= 0) ? &tv : NULL);
+                  /*(timeout >= 0) ?*/ &tv /*: NULL*/);
 
 #ifndef HAVE_ALERTABLE_SELECT
-# warning FIXME! Fix cancellation and remove this crap.
     if (val == 0)
     {
         if (timeout > 0)