gallium: Allow to debug memory leaks in nested scopes.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Tue, 8 Apr 2008 02:30:36 +0000 (11:30 +0900)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Tue, 8 Apr 2008 03:04:03 +0000 (12:04 +0900)
src/gallium/auxiliary/util/p_debug_mem.c
src/gallium/include/pipe/p_debug.h

index c160afe5b7f32ea898e4f15f1821d1f85ca6a8c2..97ec9c5b3927d1380ab34d7a277d4cf6676f5a5b 100644 (file)
@@ -70,8 +70,7 @@ struct debug_memory_header
 
 static struct list_head list = { &list, &list };
 
-static unsigned long start_no = 0;
-static unsigned long end_no = 0;
+static unsigned long last_no = 0;
 
 
 void *
@@ -84,7 +83,7 @@ debug_malloc(const char *file, unsigned line, const char *function,
    if(!hdr)
       return NULL;
  
-   hdr->no = end_no++;
+   hdr->no = last_no++;
    hdr->file = file;
    hdr->line = line;
    hdr->function = function;
@@ -147,14 +146,14 @@ debug_realloc(const char *file, unsigned line, const char *function,
    return new_ptr;
 }
 
-void
-debug_memory_reset(void)
+unsigned long
+debug_memory_begin(void)
 {
-   start_no = end_no;
+   return last_no;
 }
 
 void 
-debug_memory_report(void)
+debug_memory_end(unsigned long start_no)
 {
    struct list_head *entry;
 
@@ -164,7 +163,8 @@ debug_memory_report(void)
       void *ptr;
       hdr = LIST_ENTRY(struct debug_memory_header, entry, head);
       ptr = (void *)((char *)hdr + sizeof(*hdr));
-      if(hdr->no >= start_no)
+      if(start_no <= hdr->no && hdr->no < last_no ||
+        last_no < start_no && (hdr->no < last_no || start_no <= hdr->no))
         debug_printf("%s:%u:%s: %u bytes at %p not freed\n",
                      hdr->file, hdr->line, hdr->function,
                      hdr->size, ptr);
index 9e52ad9a374d28f7cb6af156e47332bf0752db3e..235c47abacf2ed3fdac93441af953417a8a84658 100644 (file)
@@ -304,11 +304,11 @@ void *
 debug_realloc(const char *file, unsigned line, const char *function,
               void *old_ptr, size_t old_size, size_t new_size );
 
-void 
-debug_memory_reset(void);
+unsigned long
+debug_memory_begin(void);
 
 void 
-debug_memory_report(void);
+debug_memory_end(unsigned long beginning);
 
 
 #ifdef __cplusplus