On Fri, Sep 25, 2009 at 10:59 AM, Arun Sharma <[email protected]> wrote:
> Does: > #include "config.h" > work? I didn't think I was allowed to do that in client code, but I guess I am. Attached patch makes the test-async-sig pass. Thanks, -- Paul Pluzhnikov
commit 6e52c1d1ae8f86f8c0252c8a20c5c0a3cff52fff Author: Paul Pluzhnikov <[email protected]> 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 <libunwind.h> +#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
_______________________________________________ Libunwind-devel mailing list [email protected] http://lists.nongnu.org/mailman/listinfo/libunwind-devel
