From: Rémi Denis-Courmont Date: Fri, 31 Aug 2007 11:21:43 +0000 (+0000) Subject: Document signal handling X-Git-Tag: 0.9.0-test0~6021 X-Git-Url: https://git.videolan.org/gitweb.cgi/vlc.git/?p=vlc.git;p=vlc.git;a=commitdiff_plain;h=54668b797785ffe895317f3e2bb81bcb8baac715;hp=64099a686f824e59b949aa89b47894cdb63016f2 Document signal handling --- diff --git a/src/vlc.c b/src/vlc.c index 77f793cbc6..dbc2b306f9 100644 --- a/src/vlc.c +++ b/src/vlc.c @@ -98,11 +98,30 @@ int main( int i_argc, char *ppsz_argv[] ) } #if !defined(WIN32) && !defined(UNDER_CE) - /* Synchronously intercepted signals. They 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. + /* 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 exitsigs[] = { SIGINT, SIGHUP, SIGQUIT, SIGTERM }; + /* Signals that cause a no-op: + * - SIGALRM should not happen, but lets stay on the safe side. + * - SIGPIPE might happen with sockets and would crash VLC. It MUST be + * blocked by any LibVLC-dependant application, in addition to VLC. + * - SIGCHLD is comes after exec*() (such as httpd CGI support) and must + * be dequeued to cleanup zombie processes. + */ static const int dummysigs[] = { SIGALRM, SIGPIPE, SIGCHLD }; sigset_t set;