summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/auxiliary/util/u_debug_refcnt.c27
-rw-r--r--src/gallium/auxiliary/util/u_debug_stack.c17
-rw-r--r--src/gallium/auxiliary/util/u_debug_stack.h5
3 files changed, 26 insertions, 23 deletions
diff --git a/src/gallium/auxiliary/util/u_debug_refcnt.c b/src/gallium/auxiliary/util/u_debug_refcnt.c
index cb0158253e1..728dbee9735 100644
--- a/src/gallium/auxiliary/util/u_debug_refcnt.c
+++ b/src/gallium/auxiliary/util/u_debug_refcnt.c
@@ -134,18 +134,6 @@ debug_serial_delete(void *p)
#define STACK_LEN 64
-static void
-dump_stack(const char *symbols[STACK_LEN])
-{
- unsigned i;
- for (i = 0; i < STACK_LEN; ++i) {
- if (symbols[i])
- fprintf(stream, "%s\n", symbols[i]);
- }
- fprintf(stream, "\n");
-}
-
-
/**
* Log a reference count change to the log file (if enabled).
* This is called via the pipe_reference() and debug_reference() functions,
@@ -180,7 +168,6 @@ debug_reference_slowpath(const struct pipe_reference *p,
if (debug_refcnt_state > 0) {
struct debug_stack_frame frames[STACK_LEN];
- const char *symbols[STACK_LEN];
char buf[1024];
unsigned i;
unsigned refcnt = p->count;
@@ -188,18 +175,12 @@ debug_reference_slowpath(const struct pipe_reference *p,
boolean existing = debug_serial((void *) p, &serial);
debug_backtrace_capture(frames, 1, STACK_LEN);
- for (i = 0; i < STACK_LEN; ++i) {
- if (frames[i].function)
- symbols[i] = debug_symbol_name_cached(frames[i].function);
- else
- symbols[i] = 0;
- }
get_desc(buf, p);
if (!existing) {
fprintf(stream, "<%s> %p %u Create\n", buf, (void *) p, serial);
- dump_stack(symbols);
+ debug_backtrace_print(stream, frames, STACK_LEN);
/* this is here to provide a gradual change even if we don't see
* the initialization
@@ -207,20 +188,20 @@ debug_reference_slowpath(const struct pipe_reference *p,
for (i = 1; i <= refcnt - change; ++i) {
fprintf(stream, "<%s> %p %u AddRef %u\n", buf, (void *) p,
serial, i);
- dump_stack(symbols);
+ debug_backtrace_print(stream, frames, STACK_LEN);
}
}
if (change) {
fprintf(stream, "<%s> %p %u %s %u\n", buf, (void *) p, serial,
change > 0 ? "AddRef" : "Release", refcnt);
- dump_stack(symbols);
+ debug_backtrace_print(stream, frames, STACK_LEN);
}
if (!refcnt) {
debug_serial_delete((void *) p);
fprintf(stream, "<%s> %p %u Destroy\n", buf, (void *) p, serial);
- dump_stack(symbols);
+ debug_backtrace_print(stream, frames, STACK_LEN);
}
fflush(stream);
diff --git a/src/gallium/auxiliary/util/u_debug_stack.c b/src/gallium/auxiliary/util/u_debug_stack.c
index 1faa1903a76..f941234de20 100644
--- a/src/gallium/auxiliary/util/u_debug_stack.c
+++ b/src/gallium/auxiliary/util/u_debug_stack.c
@@ -162,3 +162,20 @@ debug_backtrace_dump(const struct debug_stack_frame *backtrace,
}
}
+
+void
+debug_backtrace_print(FILE *f,
+ const struct debug_stack_frame *backtrace,
+ unsigned nr_frames)
+{
+ unsigned i;
+
+ for (i = 0; i < nr_frames; ++i) {
+ const char *symbol;
+ if (!backtrace[i].function)
+ break;
+ symbol = debug_symbol_name_cached(backtrace[i].function);
+ if (symbol)
+ fprintf(f, "%s\n", symbol);
+ }
+}
diff --git a/src/gallium/auxiliary/util/u_debug_stack.h b/src/gallium/auxiliary/util/u_debug_stack.h
index b1848ddefa8..04eba08f89a 100644
--- a/src/gallium/auxiliary/util/u_debug_stack.h
+++ b/src/gallium/auxiliary/util/u_debug_stack.h
@@ -28,6 +28,7 @@
#ifndef U_DEBUG_STACK_H_
#define U_DEBUG_STACK_H_
+#include <stdio.h>
/**
* @file
@@ -64,6 +65,10 @@ void
debug_backtrace_dump(const struct debug_stack_frame *backtrace,
unsigned nr_frames);
+void
+debug_backtrace_print(FILE *f,
+ const struct debug_stack_frame *backtrace,
+ unsigned nr_frames);
#ifdef __cplusplus
}