commit 6e52c1d1ae8f86f8c0252c8a20c5c0a3cff52fff Author: Paul Pluzhnikov Date: Fri Sep 25 11:14:20 2009 -0700 When libunwind is configured with --enable-block-signals=no, we must block recursion via sighandlers by "external" means. diff --git a/tests/test-async-sig.c b/tests/test-async-sig.c index 9309076..4f2ac0e 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