]> git.sesse.net Git - vlc/commitdiff
Maemo: work-around segmentation fault when poll() unwinds
authorRémi Denis-Courmont <remi@remlab.net>
Tue, 15 Dec 2009 15:59:17 +0000 (17:59 +0200)
committerRémi Denis-Courmont <remi@remlab.net>
Sun, 9 May 2010 11:57:12 +0000 (14:57 +0300)
(This seems like a toolchain bug)

bin/vlc.c
include/vlc_fixups.h
src/misc/pthread.c
src/network/poll.c

index d6fc5a820fa3f43ab0ea728f07d3e948f9de8bbc..034f0cae45d4af8ca1c839f8c86a38e249901270 100644 (file)
--- a/bin/vlc.c
+++ b/bin/vlc.c
@@ -50,6 +50,13 @@ extern void vlc_enable_override (void);
 #include <unistd.h>
 #include <dlfcn.h>
 
+#ifdef HAVE_MAEMO
+static void dummy_handler (int signum)
+{
+    (void) signum;
+}
+#endif
+
 /*****************************************************************************
  * main: parse command line, start interface and spawn threads.
  *****************************************************************************/
@@ -132,6 +139,13 @@ int main( int i_argc, const char *ppsz_argv[] )
     sigemptyset (&set);
     for (unsigned i = 0; i < sizeof (sigs) / sizeof (sigs[0]); i++)
         sigaddset (&set, sigs[i]);
+#ifdef HAVE_MAEMO
+    sigaddset (&set, SIGRTMIN);
+    {
+        struct sigaction act = { .sa_handler = dummy_handler, };
+        sigaction (SIGRTMIN, &act, NULL);
+    }
+#endif
 
     /* Block all these signals */
     pthread_sigmask (SIG_BLOCK, &set, NULL);
index c832197680ca0f879602a79360885294bdafdd27..25102fa3f6c92dfdf1eda4ebf73d6e703846ab73 100644 (file)
@@ -241,6 +241,10 @@ struct pollfd
 };
 
 # define poll(a, b, c) vlc_poll(a, b, c)
+#elif defined (HAVE_MAEMO)
+# include <poll.h>
+# define poll(a, b, c) vlc_poll(a, b, c)
+int vlc_poll (struct pollfd *, unsigned, int);
 #endif
 
 #ifndef HAVE_TDESTROY
index 264d1bf713bde7b0c9e3d70e60562ba1d07a7b1d..5385d7c0a08594b43ea54e783023690300eb0481 100644 (file)
@@ -688,6 +688,9 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data,
 void vlc_cancel (vlc_thread_t thread_id)
 {
     pthread_cancel (thread_id);
+#ifdef HAVE_MAEMO
+    pthread_kill (thread_id, SIGRTMIN);
+#endif
 }
 
 /**
index cf9554a30ab687c453425985cf52f6a025b24820..eb97c83db07749449b3dfac987ff927a6bf089fe 100644 (file)
 #include <vlc_network.h>
 
 
-#ifdef HAVE_POLL
+#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)