#include "u_debug_symbol.h"
#include "u_debug_stack.h"
#include "pipe/p_config.h"
+#include "c11/threads.h"
#if defined(HAVE_LIBUNWIND)
#include <windows.h>
#endif
-
/**
* Capture stack backtrace.
*
}
+static mtx_t backtrace_mutex;
+
+static void
+initialize_backtrace_mutex()
+{
+ static bool first = true;
+
+ if (first) {
+ (void)mtx_init(&backtrace_mutex, mtx_plain);
+ first = false;
+ }
+}
+
void
debug_backtrace_dump(const struct debug_stack_frame *backtrace,
unsigned nr_frames)
{
unsigned i;
-
+ initialize_backtrace_mutex();
+ mtx_lock(&backtrace_mutex);
for (i = 0; i < nr_frames; ++i) {
if (!backtrace[i].function)
break;
debug_symbol_print(backtrace[i].function);
}
+ mtx_unlock(&backtrace_mutex);
}
{
unsigned i;
+ initialize_backtrace_mutex();
+ mtx_lock(&backtrace_mutex);
for (i = 0; i < nr_frames; ++i) {
const char *symbol;
if (!backtrace[i].function)
if (symbol)
fprintf(f, "%s\n", symbol);
}
+ fflush(f);
+ mtx_unlock(&backtrace_mutex);
}
#endif /* HAVE_LIBUNWIND */