From 1867fc210fa14d68d1b139a04c5d79a0e344c6bc Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Thu, 2 Jan 2014 16:43:13 -0500 Subject: [PATCH] unix signals: stop using atomics They are not required here. See the discussion in the bug report. https://bugzilla.gnome.org/show_bug.cgi?id=711090 --- glib/gmain.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/glib/gmain.c b/glib/gmain.c index 7de3ff3..37df32c 100644 --- a/glib/gmain.c +++ b/glib/gmain.c @@ -4835,7 +4835,20 @@ dispatch_unix_signals_unlocked (void) * races. */ for (i = 0; i < NSIG; i++) - pending[i] = g_atomic_int_compare_and_exchange (&unix_signal_pending[i], TRUE, FALSE); + { + /* Be very careful with (the volatile) unix_signal_pending. + * + * We must ensure that it's not possible that we clear it without + * handling the signal. We therefore must ensure that our pending + * array has a field set (ie: we will do something about the + * signal) before we clear the item in unix_signal_pending. + * + * Note specifically: we must check _our_ array. + */ + pending[i] = unix_signal_pending[i]; + if (pending[i]) + unix_signal_pending[i] = FALSE; + } /* handle GChildWatchSource instances */ if (pending[SIGCHLD]) -- 2.7.4