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..eaa9ce9 100644
--- a/tests/test-async-sig.c
+++ b/tests/test-async-sig.c
@@ -32,6 +32,7 @@
#define UNW_LOCAL_ONLY
#include <libunwind.h>
+#include "config.h"
static const int nerrors_max = 100;
@@ -45,6 +46,14 @@
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 @@
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 @@
}
}
while (ret > 0);
+
+#ifndef CONFIG_BLOCK_SIGNALS
+ recurcount -= 1;
+#endif
}
void