timeval: Fix occasional backtrace() related deadlock.
[openvswitch] / lib / timeval.c
index 05f1c2d3643030dc16c20bdcacb44cc0f72311ac..d8539892afa57145f6d90d84056f1eb0dc86c010 100644 (file)
@@ -121,6 +121,16 @@ time_init(void)
     }
     inited = true;
 
+    /* The implementation of backtrace() in glibc does some one time
+     * initialization which is not signal safe.  This can cause deadlocks if
+     * run from the signal handler.  As a workaround, force the initialization
+     * to happen here. */
+    if (HAVE_EXECINFO_H) {
+        void *bt[1];
+
+        backtrace(bt, ARRAY_SIZE(bt));
+    }
+
     memset(traces, 0, sizeof traces);
 
     if (HAVE_EXECINFO_H && CACHE_TIME) {