]> Savannah Git Hosting - gnulib.git/commitdiff
fatal-signal: Make multithread-safe.
authorBruno Haible <bruno@clisp.org>
Sat, 4 Jul 2020 10:43:26 +0000 (12:43 +0200)
committerBruno Haible <bruno@clisp.org>
Sat, 4 Jul 2020 10:43:55 +0000 (12:43 +0200)
* lib/fatal-signal.c (init_fatal_signals): Add comment.
(do_init_fatal_signal_set): New function, extracted from
init_fatal_signal_set.
(fatal_signal_set_once): New variable.
(init_fatal_signal_set): Use gl_once.

ChangeLog
lib/fatal-signal.c

index 59897eff6ac11d8e9099e59c7946d45e999fbbef..22c6e09e5e203b58fe31852e4f9ef51fd475968d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2020-07-04  Bruno Haible  <bruno@clisp.org>
+
+       fatal-signal: Make multithread-safe.
+       * lib/fatal-signal.c (init_fatal_signals): Add comment.
+       (do_init_fatal_signal_set): New function, extracted from
+       init_fatal_signal_set.
+       (fatal_signal_set_once): New variable.
+       (init_fatal_signal_set): Use gl_once.
+
 2020-07-03  Bruno Haible  <bruno@clisp.org>
 
        getrandom: Fix compilation error on native Windows (regr. 2020-06-28).
index c6f8dacbdeba58296c6a58615cba946ef39339d1..8b27cc6feb8d7eae29bc90177d0a01446ae68b68 100644 (file)
@@ -86,6 +86,10 @@ static int fatal_signals[] =
 static void
 init_fatal_signals (void)
 {
+  /* This function is multithread-safe even without synchronization, because
+     if two threads execute it simultaneously, the fatal_signals[] array will
+     not change any more after the first of the threads has completed this
+     function.  */
   static bool fatal_signals_initialized = false;
   if (!fatal_signals_initialized)
     {
@@ -266,22 +270,25 @@ at_fatal_signal (action_t action)
 static sigset_t fatal_signal_set;
 
 static void
-init_fatal_signal_set (void)
+do_init_fatal_signal_set (void)
 {
-  static bool fatal_signal_set_initialized = false;
-  if (!fatal_signal_set_initialized)
-    {
-      size_t i;
+  size_t i;
 
-      init_fatal_signals ();
+  init_fatal_signals ();
 
-      sigemptyset (&fatal_signal_set);
-      for (i = 0; i < num_fatal_signals; i++)
-        if (fatal_signals[i] >= 0)
-          sigaddset (&fatal_signal_set, fatal_signals[i]);
+  sigemptyset (&fatal_signal_set);
+  for (i = 0; i < num_fatal_signals; i++)
+    if (fatal_signals[i] >= 0)
+      sigaddset (&fatal_signal_set, fatal_signals[i]);
+}
 
-      fatal_signal_set_initialized = true;
-    }
+/* Ensure that do_init_fatal_signal_set is called once only.  */
+gl_once_define(static, fatal_signal_set_once)
+
+static void
+init_fatal_signal_set (void)
+{
+  gl_once (fatal_signal_set_once, do_init_fatal_signal_set);
 }
 
 /* Lock and counter that allow block_fatal_signals/unblock_fatal_signals pairs