----- Original Message ----- > The former just checks that the given block is valid by checking > the header and footer. > > The later sets the memory block's tag. With extra debug code, we > can use that for monitoring/checking particular allocations. > --- > src/gallium/auxiliary/os/os_memory_debug.h | 6 +++ > src/gallium/auxiliary/util/u_debug_memory.c | 55 > +++++++++++++++++++++++++++ > 2 files changed, 61 insertions(+), 0 deletions(-) > > diff --git a/src/gallium/auxiliary/os/os_memory_debug.h > b/src/gallium/auxiliary/os/os_memory_debug.h > index 36b8fc6..9a487de 100644 > --- a/src/gallium/auxiliary/os/os_memory_debug.h > +++ b/src/gallium/auxiliary/os/os_memory_debug.h > @@ -60,6 +60,12 @@ 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_tag(void *ptr, unsigned tag); > + > +void > +debug_memory_check_block(void *ptr); > + > void > debug_memory_check(void); > > diff --git a/src/gallium/auxiliary/util/u_debug_memory.c > b/src/gallium/auxiliary/util/u_debug_memory.c > index 4bf26a5..4723547 100644 > --- a/src/gallium/auxiliary/util/u_debug_memory.c > +++ b/src/gallium/auxiliary/util/u_debug_memory.c > @@ -76,6 +76,7 @@ struct debug_memory_header > #endif > > unsigned magic; > + unsigned tag;
Long term, I think a "const char * tag" would be handier -- it could be used in the debug messages. > }; > > struct debug_memory_footer > @@ -140,6 +141,7 @@ debug_malloc(const char *file, unsigned line, const char > *function, > hdr->function = function; > hdr->size = size; > hdr->magic = DEBUG_MEMORY_MAGIC; > + hdr->tag = 0; > #if DEBUG_FREED_MEMORY > hdr->freed = FALSE; > #endif > @@ -263,6 +265,7 @@ debug_realloc(const char *file, unsigned line, const char > *function, > new_hdr->function = old_hdr->function; > new_hdr->size = new_size; > new_hdr->magic = DEBUG_MEMORY_MAGIC; > + new_hdr->tag = 0; > #if DEBUG_FREED_MEMORY > new_hdr->freed = FALSE; > #endif > @@ -348,6 +351,58 @@ debug_memory_end(unsigned long start_no) > > > /** > + * Put a tag (arbitrary integer) on a memory block. > + * Can be useful for debugging. > + */ > +void > +debug_memory_tag(void *ptr, unsigned tag) > +{ > + struct debug_memory_header *hdr; > + > + if (!ptr) > + return; > + > + hdr = header_from_data(ptr); > + if (hdr->magic != DEBUG_MEMORY_MAGIC) { > + debug_printf("%s corrupted memory at %p\n", __FUNCTION__, ptr); > + debug_assert(0); > + } > + > + hdr->tag = tag; > +} > + > + > +/** > + * Check the given block of memory for validity/corruption. > + */ > +void > +debug_memory_check_block(void *ptr) > +{ > + struct debug_memory_header *hdr; > + struct debug_memory_footer *ftr; > + > + if (!ptr) > + return; > + > + hdr = header_from_data(ptr); > + ftr = footer_from_header(hdr); > + > + if (hdr->magic != DEBUG_MEMORY_MAGIC) { > + debug_printf("%s:%u:%s: bad or corrupted memory %p\n", > + hdr->file, hdr->line, hdr->function, ptr); > + debug_assert(0); > + } > + > + if (ftr->magic != DEBUG_MEMORY_MAGIC) { > + debug_printf("%s:%u:%s: buffer overflow %p\n", > + hdr->file, hdr->line, hdr->function, ptr); > + debug_assert(0); > + } > +} > + > + > + > +/** > * We can periodically call this from elsewhere to do a basic sanity > * check of the heap memory we've allocated. > */ > Reviewed-by: Jose Fonseca <jfons...@vmware.com> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev