From 7f42234cabfde2f61ced5694eb9e09ea49c40987 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Tue, 15 Dec 2009 17:59:17 +0200 Subject: [PATCH] Maemo: work-around segmentation fault when poll() unwinds (This seems like a toolchain bug) --- bin/vlc.c | 14 ++++++++++++++ include/vlc_fixups.h | 4 ++++ src/misc/pthread.c | 3 +++ src/network/poll.c | 34 +++++++++++++++++++++++++++++++++- 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/bin/vlc.c b/bin/vlc.c index d6fc5a820f..034f0cae45 100644 --- a/bin/vlc.c +++ b/bin/vlc.c @@ -50,6 +50,13 @@ extern void vlc_enable_override (void); #include #include +#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); diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h index c832197680..25102fa3f6 100644 --- a/include/vlc_fixups.h +++ b/include/vlc_fixups.h @@ -241,6 +241,10 @@ struct pollfd }; # define poll(a, b, c) vlc_poll(a, b, c) +#elif defined (HAVE_MAEMO) +# include +# define poll(a, b, c) vlc_poll(a, b, c) +int vlc_poll (struct pollfd *, unsigned, int); #endif #ifndef HAVE_TDESTROY diff --git a/src/misc/pthread.c b/src/misc/pthread.c index 264d1bf713..5385d7c0a0 100644 --- a/src/misc/pthread.c +++ b/src/misc/pthread.c @@ -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 } /** diff --git a/src/network/poll.c b/src/network/poll.c index cf9554a30a..eb97c83db0 100644 --- a/src/network/poll.c +++ b/src/network/poll.c @@ -30,7 +30,39 @@ #include -#ifdef HAVE_POLL +#if HAVE_MAEMO +# include +# include +# include + +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) -- 2.39.2