Mask all signals in GLib worker thread
authorRyan Lortie <desrt@desrt.ca>
Fri, 14 Oct 2011 17:02:58 +0000 (13:02 -0400)
committerRyan Lortie <desrt@desrt.ca>
Sat, 15 Oct 2011 00:01:22 +0000 (20:01 -0400)
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
glib/gmain.c

index 3fe5934..309bded 100644 (file)
@@ -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
index ef9ac46..df87f90 100644 (file)
@@ -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);
     }