From 543a550837f40e39c9f6f110e927b4c230c2d77c Mon Sep 17 00:00:00 2001 From: Ethan Jackson Date: Fri, 26 Oct 2012 12:33:01 -0700 Subject: [PATCH 1/1] timeval: Fix occasional backtrace() related deadlock. Occasionally, backtrace() will deadlock in the signal handler because it does some non signal safe initialization. Specifically, it opens a shared object. As a work around, this patch forces backtrace() to run outside of a signal handler, so that future calls will perform as expected. Signed-off-by: Ethan Jackson --- lib/timeval.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/timeval.c b/lib/timeval.c index 05f1c2d36..d8539892a 100644 --- a/lib/timeval.c +++ b/lib/timeval.c @@ -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) { -- 2.43.0