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

Reply via email to