aboutsummaryrefslogtreecommitdiff
path: root/libgo/runtime/go-callers.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2013-12-01 01:40:16 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2013-12-01 01:40:16 +0000
commit2583109c81b60c64d5ed38e61622c39c1530805f (patch)
tree65d707a5cf1d78dd3fd10b552aad7a0bb4d2e983 /libgo/runtime/go-callers.c
parent2d7930e5e3876af6cca4c823e03fb75d0f92f9ad (diff)
downloadgcc-2583109c81b60c64d5ed38e61622c39c1530805f.zip
gcc-2583109c81b60c64d5ed38e61622c39c1530805f.tar.gz
gcc-2583109c81b60c64d5ed38e61622c39c1530805f.tar.bz2
libgo: Avoid some cases of getting callers recursively.
Avoids hanging inside older versions of glibc that do not support recurive calls to dl_iterate_phdr. From-SVN: r205561
Diffstat (limited to 'libgo/runtime/go-callers.c')
-rw-r--r--libgo/runtime/go-callers.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/libgo/runtime/go-callers.c b/libgo/runtime/go-callers.c
index 291dfd0..ae411d9 100644
--- a/libgo/runtime/go-callers.c
+++ b/libgo/runtime/go-callers.c
@@ -11,6 +11,13 @@
#include "runtime.h"
#include "array.h"
+/* This is set to non-zero when calling backtrace_full. This is used
+ to avoid getting hanging on a recursive lock in dl_iterate_phdr on
+ older versions of glibc when a SIGPROF signal arrives while
+ collecting a backtrace. */
+
+uint32 runtime_in_callers;
+
/* Argument passed to callback function. */
struct callers_data
@@ -111,8 +118,10 @@ runtime_callers (int32 skip, Location *locbuf, int32 m)
data.skip = skip + 1;
data.index = 0;
data.max = m;
+ runtime_xadd (&runtime_in_callers, 1);
backtrace_full (__go_get_backtrace_state (), 0, callback, error_callback,
&data);
+ runtime_xadd (&runtime_in_callers, -1);
return data.index;
}