[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).

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=566d7d2fc459ca6047acbf3194275ce780c8190c
---

 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
--- a/src/misc/threads.c
+++ b/src/misc/threads.c
@@ -495,20 +495,24 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
     pthread_attr_t attr;
     pthread_attr_init (&attr);
 
+    /* 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);
 
 #ifndef __APPLE__




More information about the vlc-devel mailing list