Commit 566d7d2f authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont
Browse files

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).
parent 0ad8477b
...@@ -495,20 +495,24 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line ...@@ -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_t attr;
pthread_attr_init (&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; sigset_t set, oldset;
/* We really don't want signals to (literaly) interrupt our blocking I/O sigemptyset (&set);
* system calls. SIGPIPE is especially bad, as it can be caused by remote sigdelset (&set, SIGHUP);
* peers through connected sockets. Generally, we cannot know which signals sigaddset (&set, SIGINT);
* are handled by the main program. Also, external LibVLC bindings tend not sigaddset (&set, SIGQUIT);
* to setup a proper signal mask before invoking LibVLC. sigaddset (&set, SIGTERM);
* Hence, we hereby block all signals, except those for which blocking is
* undefined, as listed below. Note that SIGKILL and SIGSTOP need not be sigaddset (&set, SIGPIPE); /* We don't want this one, really! */
* listed (see the documentation for pthread_sigmask) here. */
sigfillset (&set);
sigdelset (&set, SIGFPE);
sigdelset (&set, SIGILL);
sigdelset (&set, SIGSEGV);
sigdelset (&set, SIGBUS);
pthread_sigmask (SIG_BLOCK, &set, &oldset); pthread_sigmask (SIG_BLOCK, &set, &oldset);
#ifndef __APPLE__ #ifndef __APPLE__
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment