unix signals: stop using atomics
authorRyan Lortie <desrt@desrt.ca>
Thu, 2 Jan 2014 21:43:13 +0000 (16:43 -0500)
committerRyan Lortie <desrt@desrt.ca>
Fri, 3 Jan 2014 01:38:40 +0000 (20:38 -0500)
They are not required here.  See the discussion in the bug report.

https://bugzilla.gnome.org/show_bug.cgi?id=711090

glib/gmain.c

index 7de3ff3..37df32c 100644 (file)
@@ -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])