]> git.sesse.net Git - vlc/commitdiff
Don't block all signals.
authorRémi Denis-Courmont <rdenis@simphalempin.com>
Thu, 12 Jun 2008 17:40:23 +0000 (20:40 +0300)
committerRémi Denis-Courmont <rdenis@simphalempin.com>
Thu, 12 Jun 2008 17:40:23 +0000 (20:40 +0300)
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

index 0ae8fb4a1d236f9b84ce5262a8cbb0700085c9a5..a7ab5c07b0d3f9441e31a55e2648d800bb41bcd7 100644 (file)
@@ -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__