Linux segfault management: initialize strsignals on the main thread 93/18293/2
Clément DAVID [Thu, 23 Jun 2016 09:19:14 +0000 (11:19 +0200)]
Some tests lock on OpenTCLsci() / pthread_cond_wait(), the watchdog_thread
kill the process and should trigger a stacktrace display *BUT* strsignal()
(used to have a readable signal name) call a thread unsafe pthread_once()
that deadlock everything.

This commit is a try to initialize signal names at process startup.

Change-Id: I62a34bf49a559b4ce1fafb94224b1062c912538e

scilab/modules/core/src/c/signal_mgmt.c

index c0fc135..b948e4c 100644 (file)
@@ -88,17 +88,9 @@ static void sig_fatal(int signum, siginfo_t * info, void *p)
 
     /* This list comes from OpenMPI sources */
 #ifdef HAVE_STRSIGNAL
-    /* On segfault, avoid calling strsignal which may allocate some memory (through gettext) */
     {
         char* str;
-        if (signum == 11)
-        {
-            str = "Segmentation fault";
-        }
-        else
-        {
-            str = strsignal(signum);
-        }
+        str = strsignal(signum);
         ret = snprintf(tmp, size, HOSTFORMAT "Signal: %s (%d)\n", stacktrace_hostname, getpid(), str, signum);
     }
 #else
@@ -489,6 +481,11 @@ void base_error_init(void)
             fprintf(stderr, "Could not set handler for signal %d\n", signals[j]);
         }
     }
+
+#ifdef HAVE_STRSIGNAL
+    // initialize the glibc internal string representation.
+    strsignal(SIGABRT);
+#endif
 }
 
 static void* watchdog_thread(void* arg)