From b7e3444fea7f19f05e1fe033b96efad394ab9b4a Mon Sep 17 00:00:00 2001 From: Paul Pluzhnikov Date: Fri, 25 Sep 2009 14:17:35 -0700 Subject: [PATCH] When libunwind is configured with --enable-block-signals=no, we must block recursion via sighandlers by "external" means. --- tests/test-async-sig.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/test-async-sig.c b/tests/test-async-sig.c index 9309076c..eaa9ce90 100644 --- a/tests/test-async-sig.c +++ b/tests/test-async-sig.c @@ -32,6 +32,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #define UNW_LOCAL_ONLY #include +#include "config.h" static const int nerrors_max = 100; @@ -45,6 +46,14 @@ int verbose; int nerrors; int sigcount; +#ifndef CONFIG_BLOCK_SIGNALS +/* When libunwind is configured with --enable-block-signals=no, the caller + is responsible for preventing recursion via signal handlers. + We use a simple global here. In a multithreaded program, one would use + a thread-local variable. */ +int recurcount; +#endif + #define panic(args...) \ { ++nerrors; fprintf (stderr, args); return; } @@ -58,6 +67,12 @@ do_backtrace (int may_print, int get_proc_name) int ret; int depth = 0; +#ifndef CONFIG_BLOCK_SIGNALS + if (recurcount > 0) + return; + recurcount += 1; +#endif + unw_getcontext (&uc); if (unw_init_local (&cursor, &uc) < 0) panic ("unw_init_local failed!\n"); @@ -102,6 +117,10 @@ do_backtrace (int may_print, int get_proc_name) } } while (ret > 0); + +#ifndef CONFIG_BLOCK_SIGNALS + recurcount -= 1; +#endif } void