[vlc-devel] commit: Don't block all signals. ( Rémi Denis-Courmont )
git version control
git at videolan.org
Thu Jun 12 19:38:32 CEST 2008
vlc | branch: master | Rémi Denis-Courmont <rdenis at simphalempin.com> | Thu Jun 12 20:40:23 2008 +0300| [566d7d2fc459ca6047acbf3194275ce780c8190c]
Don't block all signals.
Some (buggy?) thread implementations use RT signals internally...
The handling of SIGPIPE remains somewhat problematic. We should probably
use MSG_NOSIGNAL when writing to sockets, but this does not work when
dealing with pipes/FIFOs or writing to sockets using write(). In
particular, net_Write uses write() so that it can be used on non-socket
descriptors too (I believe this is used by the RC interface).
src/misc/threads.c | 30 +++++++++++++++++-------------
1 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/src/misc/threads.c b/src/misc/threads.c
index 0ae8fb4..a7ab5c0 100644
@@ -495,20 +495,24 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
+ /* Block the signals that signals interface plugin handles.
+ * If the LibVLC caller wants to handle some signals by itself, it should
+ * block these before whenever invoking LibVLC. And it must obviously not
+ * start the VLC signals interface plugin.
+ * LibVLC will normally ignore any interruption caused by an asynchronous
+ * signal during a system call. But there may well be some buggy cases
+ * where it fails to handle EINTR (bug reports welcome). Some underlying
+ * libraries might also not handle EINTR properly.
sigset_t set, oldset;
- /* We really don't want signals to (literaly) interrupt our blocking I/O
- * system calls. SIGPIPE is especially bad, as it can be caused by remote
- * peers through connected sockets. Generally, we cannot know which signals
- * are handled by the main program. Also, external LibVLC bindings tend not
- * to setup a proper signal mask before invoking LibVLC.
- * Hence, we hereby block all signals, except those for which blocking is
- * undefined, as listed below. Note that SIGKILL and SIGSTOP need not be
- * listed (see the documentation for pthread_sigmask) here. */
- sigfillset (&set);
- sigdelset (&set, SIGFPE);
- sigdelset (&set, SIGILL);
- sigdelset (&set, SIGSEGV);
- sigdelset (&set, SIGBUS);
+ sigemptyset (&set);
+ sigdelset (&set, SIGHUP);
+ sigaddset (&set, SIGINT);
+ sigaddset (&set, SIGQUIT);
+ sigaddset (&set, SIGTERM);
+ sigaddset (&set, SIGPIPE); /* We don't want this one, really! */
pthread_sigmask (SIG_BLOCK, &set, &oldset);
More information about the vlc-devel