[glib] Mask all signals in GLib worker thread



commit 51773c6c64431c03242a6f3d12d44f99282c815c
Author: Ryan Lortie <desrt desrt ca>
Date:   Fri Oct 14 13:02:58 2011 -0400

    Mask all signals in GLib worker thread
    
    Some code using GLib (gnome-keyring-daemon, for example) assumes that
    they can catch signals by masking them out in the main thread and
    calling sigwait() from a worker.
    
    The problem is that our new worker thread catches the signals before
    sigwait() has a chance and the default action occurs (typically
    resulting in program termination).
    
    If we mask all the signals in our worker, then this can't happen.

 docs/reference/glib/tmpl/macros_misc.sgml |   15 +++++++++++++++
 glib/gmain.c                              |   11 +++++++++++
 2 files changed, 26 insertions(+), 0 deletions(-)
---
diff --git a/docs/reference/glib/tmpl/macros_misc.sgml b/docs/reference/glib/tmpl/macros_misc.sgml
index 3fe5934..309bded 100644
--- a/docs/reference/glib/tmpl/macros_misc.sgml
+++ b/docs/reference/glib/tmpl/macros_misc.sgml
@@ -467,6 +467,21 @@ Since: 2.14
 
 
 
+<!-- ##### MACRO G_DEPRECATED ##### -->
+<para>
+
+</para>
+
+
+
+<!-- ##### MACRO G_DEPRECATED_FOR ##### -->
+<para>
+
+</para>
+
+ f: 
+
+
 <!-- ##### MACRO G_LIKELY ##### -->
 <para>
 Hints the compiler that the expression is likely to evaluate to a true
diff --git a/glib/gmain.c b/glib/gmain.c
index ef9ac46..df87f90 100644
--- a/glib/gmain.c
+++ b/glib/gmain.c
@@ -4757,8 +4757,19 @@ g_get_worker_context (void)
 
   if (g_once_init_enter (&initialised))
     {
+      /* mask all signals in the worker thread */
+#ifdef G_OS_UNIX
+      sigset_t prev_mask;
+      sigset_t all;
+
+      sigfillset (&all);
+      pthread_sigmask (SIG_SETMASK, &all, &prev_mask);
+#endif
       glib_worker_context = g_main_context_new ();
       g_thread_new ("gmain", glib_worker_main, NULL);
+#ifdef G_OS_UNIX
+      pthread_sigmask (SIG_SETMASK, &prev_mask, NULL);
+#endif
       g_once_init_leave (&initialised, TRUE);
     }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]