-#ifndef WIN32
-/*****************************************************************************
- * SigHandler: system signal handler
- *****************************************************************************
- * This function is called when a fatal signal is received by the program.
- * It tries to end the program in a clean way.
- *****************************************************************************/
-static void SigHandler( int i_signal )
-{
- static mtime_t abort_time = 0;
- static volatile vlc_bool_t b_die = VLC_FALSE;
+ /* Synchronously intercepted POSIX signals.
+ *
+ * In a threaded program such as VLC, the only sane way to handle signals
+ * is to block them in all thread but one - this is the only way to
+ * predict which thread will receive them. If any piece of code depends
+ * on delivery of one of this signal it is intrinsically not thread-safe
+ * and MUST NOT be used in VLC, whether we like it or not.
+ * There is only one exception: if the signal is raised with
+ * pthread_kill() - we do not use this in LibVLC but some pthread
+ * implementations use them internally. You should really use conditions
+ * for thread synchronization anyway.
+ *
+ * Signal that request a clean shutdown, and force an unclean shutdown
+ * if they are triggered again 2+ seconds later.
+ * We have to handle SIGTERM cleanly because of daemon mode.
+ * Note that we set the signals after the vlc_create call. */
+ static const int sigs[] = {
+ SIGINT, SIGHUP, SIGQUIT, SIGTERM,
+ /* Signals that cause a no-op:
+ * - SIGPIPE might happen with sockets and would crash VLC. It MUST be
+ * blocked by any LibVLC-dependent application, in addition to VLC.
+ * - SIGCHLD is comes after exec*() (such as httpd CGI support) and must
+ * be dequeued to cleanup zombie processes.
+ */
+ SIGPIPE, SIGCHLD
+ };
+
+ sigset_t set;
+ sigemptyset (&set);
+ for (unsigned i = 0; i < sizeof (sigs) / sizeof (sigs[0]); i++)
+ sigaddset (&set, sigs[i]);
+
+ /* Block all these signals */
+ pthread_sigmask (SIG_BLOCK, &set, NULL);
+
+ /* Note that FromLocale() can be used before libvlc is initialized */
+ for (int i = 0; i < i_argc; i++)
+ if ((ppsz_argv[i] = FromLocale (ppsz_argv[i])) == NULL)
+ return 1; // BOOM!
+
+ libvlc_exception_t ex, dummy;
+ libvlc_exception_init (&ex);
+ libvlc_exception_init (&dummy);