[glib] Mask all signals in GLib worker thread
- From: Ryan Lortie <ryanl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] Mask all signals in GLib worker thread
- Date: Sat, 15 Oct 2011 00:01:27 +0000 (UTC)
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]