[ovs-dev] [PATCH] timeval: Fix occasional backtrace() related deadlock.
Ethan Jackson
ethan at nicira.com
Fri Oct 26 19:36:41 UTC 2012
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 <ethan at nicira.com>
---
lib/timeval.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/lib/timeval.c b/lib/timeval.c
index 05f1c2d..d853989 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) {
--
1.7.9.5
More information about the dev
mailing list