mirror of
https://github.com/openvswitch/ovs
synced 2025-09-01 06:45:17 +00:00
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 <ethan@nicira.com>
This commit is contained in:
@@ -121,6 +121,16 @@ time_init(void)
|
|||||||
}
|
}
|
||||||
inited = true;
|
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);
|
memset(traces, 0, sizeof traces);
|
||||||
|
|
||||||
if (HAVE_EXECINFO_H && CACHE_TIME) {
|
if (HAVE_EXECINFO_H && CACHE_TIME) {
|
||||||
|
Reference in New Issue
Block a user