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