gallium/util: clean up stack frame printing
authorRob Clark <robdclark@gmail.com>
Fri, 24 Mar 2017 19:04:58 +0000 (15:04 -0400)
committerRob Clark <robdclark@gmail.com>
Mon, 3 Apr 2017 15:32:17 +0000 (11:32 -0400)
Prep work for next patch.

Ideally 'struct debug_stack_frame' would be opaque, but it is embedded
in a bunch of places.  But at least we can treat it opaquely.

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/auxiliary/util/u_debug_refcnt.c
src/gallium/auxiliary/util/u_debug_stack.c
src/gallium/auxiliary/util/u_debug_stack.h

index cb0158253e1670642d9c28bf33624c20ee81032d..728dbee9735ee60841d457d86c8b2573923276d7 100644 (file)
@@ -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);
index 1faa1903a769ddb0b46510ddae67cd4d20d77139..f941234de20ace635c1a43b7cbb2fd5da7e6296c 100644 (file)
@@ -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);
+   }
+}
index b1848ddefa82b181bfaea969d11a7ea6a4539f35..04eba08f89a759e9bfd86c0e4435bbf10ded8557 100644 (file)
@@ -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
 }