[vlc-commits] Revert "Work around QProcess bug (KDE bug #260719)"
Rémi Denis-Courmont
git at videolan.org
Sun Jan 30 13:22:14 CET 2011
vlc/vlc-1.1 | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Jan 30 14:21:54 2011 +0200| [521f96820b0b03407daf837d206eaf3760ce35a1] | committer: Rémi Denis-Courmont
Revert "Work around QProcess bug (KDE bug #260719)"
This reverts commit ac11f9c0e27905087afdfb46180ece227a4d76e7.
> http://git.videolan.org/gitweb.cgi/vlc/vlc-1.1.git/?a=commit;h=521f96820b0b03407daf837d206eaf3760ce35a1
---
NEWS | 3 ---
bin/vlc.c | 46 ++++++++++++++++++++--------------------------
2 files changed, 20 insertions(+), 29 deletions(-)
diff --git a/NEWS b/NEWS
index 44165f1..a88327c 100644
--- a/NEWS
+++ b/NEWS
@@ -6,9 +6,6 @@ Changes between 1.1.6 and 1.1.7-git:
Changes between 1.1.6 and 1.1.6.1:
----------------------------------
-Interfaces:
- * KDE: work around file dialog freeze due to KMimeTypeRepository and QProcess
-
Source:
* Fix libnotify, lirc, pulse building and packaging for Unix/Linux
diff --git a/bin/vlc.c b/bin/vlc.c
index 104d6ab..51633b2 100644
--- a/bin/vlc.c
+++ b/bin/vlc.c
@@ -63,11 +63,12 @@ static void dummy_handler (int signum)
int main( int i_argc, const char *ppsz_argv[] )
{
/* The so-called POSIX-compliant MacOS X reportedly processes SIGPIPE even
- * if it is blocked in all thread.
+ * if it is blocked in all thread. Also some libraries want SIGPIPE blocked
+ * as they have no clue about signal masks.
* Note: this is NOT an excuse for not protecting against SIGPIPE. If
* LibVLC runs outside of VLC, we cannot rely on this code snippet. */
signal (SIGPIPE, SIG_IGN);
- /* Restore SIGCHLD in case our parent process ignores it. */
+ /* Restore default for SIGCHLD in case parent ignores it. */
signal (SIGCHLD, SIG_DFL);
#ifdef HAVE_SETENV
@@ -104,38 +105,31 @@ int main( int i_argc, const char *ppsz_argv[] )
libvlc_get_version(), libvlc_get_changeset() );
#endif
- /* VLC uses sigwait() to dequeue interesting signals.
- * For this to work, those signals must be blocked in all threads,
- * including the thread calling sigwait() (see the man page for details).
+ /* Synchronously intercepted POSIX signals.
*
- * There are two advantages to sigwait() over traditional signal handlers:
- * - delivery is synchronous: no need to worry about async-safety,
- * - EINTR is not generated: other threads need not handle that error.
- * That being said, some LibVLC programs do not use sigwait(). Therefore
- * EINTR must still be handled cleanly, notably from poll() calls.
+ * In a threaded program such as VLC, the only sane way to handle signals
+ * is to block them in all threads 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.
*
- * Signals that request a clean shutdown, and force an unclean shutdown
+ * 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,
- /* SIGPIPE can happen and would crash the process. On modern systems,
- * the MSG_NOSIGNAL flag protects socket write operations against SIGPIPE.
- * But we still need to block SIGPIPE when:
- * - writing to pipes,
- * - using write() instead of send() for code not specific to sockets.
- * LibVLC code assumes that SIGPIPE is blocked. Other LibVLC applications
- * shall block it (or handle it somehow) too.
+ /* Signals that cause a no-op:
+ * - SIGPIPE might happen with sockets and would crash VLC. It MUST be
+ * blocked by any LibVLC-dependent application, not just VLC.
+ * - SIGCHLD comes after exec*() (such as httpd CGI support) and must
+ * be dequeued to cleanup zombie processes.
*/
- SIGPIPE,
- /* SIGCHLD must be dequeued to clean up zombie child processes.
- * Furthermore the handler must not be set to SIG_IGN (see above). */
- /* Unfortunately, the QProcess class from Qt4 has a bug. It installs a
- * custom signal handlers and gets stuck if it is not called. So we cannot
- * use sigwait() for SIGCHLD:
- * http://bugs.kde.org/show_bug.cgi?id=260719 */
- //SIGCHLD,
+ SIGPIPE, SIGCHLD
};
sigset_t set;
More information about the vlc-commits
mailing list