1
0
Fork 0
mirror of https://github.com/tobast/libunwind-eh_elf.git synced 2024-06-16 23:11:44 +02:00

When libunwind is configured with --enable-block-signals=no,

we must block recursion via sighandlers by "external" means.
This commit is contained in:
Paul Pluzhnikov 2009-09-25 14:17:35 -07:00 committed by Arun Sharma
parent 839db77b7b
commit b7e3444fea

View file

@ -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