Mesa (main): u_debug_stack: Lock around stack dumps to prevent interleaving
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon May 2 17:43:19 UTC 2022
Module: Mesa
Branch: main
Commit: 0474bbcfb9395d53b3738fc3aff6fafed368f8cb
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0474bbcfb9395d53b3738fc3aff6fafed368f8cb
Author: Jesse Natalie <jenatali at microsoft.com>
Date: Tue Apr 26 16:25:13 2022 -0700
u_debug_stack: Lock around stack dumps to prevent interleaving
Reviewed-by: Yonggang Luo <luoyonggang at gmail.com>
Reviewed-by: Sil Vilerino <sivileri at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16182>
---
src/util/u_debug_stack.c | 23 +++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/src/util/u_debug_stack.c b/src/util/u_debug_stack.c
index 87f981f987d..a0d9499d46b 100644
--- a/src/util/u_debug_stack.c
+++ b/src/util/u_debug_stack.c
@@ -36,6 +36,7 @@
#include "u_debug_symbol.h"
#include "u_debug_stack.h"
#include "pipe/p_config.h"
+#include "c11/threads.h"
#if defined(HAVE_LIBUNWIND)
@@ -186,7 +187,6 @@ debug_backtrace_print(FILE *f,
#include <windows.h>
#endif
-
/**
* Capture stack backtrace.
*
@@ -296,17 +296,32 @@ debug_backtrace_capture(struct debug_stack_frame *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);
}
@@ -317,6 +332,8 @@ debug_backtrace_print(FILE *f,
{
unsigned i;
+ initialize_backtrace_mutex();
+ mtx_lock(&backtrace_mutex);
for (i = 0; i < nr_frames; ++i) {
const char *symbol;
if (!backtrace[i].function)
@@ -325,6 +342,8 @@ debug_backtrace_print(FILE *f,
if (symbol)
fprintf(f, "%s\n", symbol);
}
+ fflush(f);
+ mtx_unlock(&backtrace_mutex);
}
#endif /* HAVE_LIBUNWIND */
More information about the mesa-commit
mailing list