From: RĂ©mi Denis-Courmont Date: Tue, 15 Dec 2009 15:59:17 +0000 (+0200) Subject: Maemo: work-around segmentation fault when poll() unwinds X-Git-Tag: 1.2.0-pre1~6720 X-Git-Url: https://git.sesse.net/?p=vlc;a=commitdiff_plain;h=7f42234cabfde2f61ced5694eb9e09ea49c40987 Maemo: work-around segmentation fault when poll() unwinds (This seems like a toolchain bug) --- 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)