From 4a72d859b4f8d0444eb7f38606d59d7ddc9ea8fa Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 16 Feb 2012 12:25:22 -0700 Subject: [PATCH] util: add mutex lock in u_debug_memory.c code The linked list of memory allocations was not protected by a mutex. This lead to sporadic failures with multi-threaded apps. Reviewed-by: Jose Fonseca --- src/gallium/auxiliary/util/u_debug_memory.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/gallium/auxiliary/util/u_debug_memory.c b/src/gallium/auxiliary/util/u_debug_memory.c index f1baa62f894..e24a8bc0b43 100644 --- a/src/gallium/auxiliary/util/u_debug_memory.c +++ b/src/gallium/auxiliary/util/u_debug_memory.c @@ -38,6 +38,7 @@ #include "os/os_memory.h" #include "os/os_memory_debug.h" +#include "os/os_thread.h" #include "util/u_debug.h" #include "util/u_debug_stack.h" @@ -72,6 +73,8 @@ struct debug_memory_footer static struct list_head list = { &list, &list }; +pipe_static_mutex(list_mutex); + static unsigned long last_no = 0; @@ -132,7 +135,9 @@ debug_malloc(const char *file, unsigned line, const char *function, ftr = footer_from_header(hdr); ftr->magic = DEBUG_MEMORY_MAGIC; + pipe_mutex_lock(list_mutex); LIST_ADDTAIL(&hdr->head, &list); + pipe_mutex_unlock(list_mutex); return data_from_header(hdr); } @@ -164,7 +169,9 @@ debug_free(const char *file, unsigned line, const char *function, debug_assert(0); } + pipe_mutex_lock(list_mutex); LIST_DEL(&hdr->head); + pipe_mutex_unlock(list_mutex); hdr->magic = 0; ftr->magic = 0; @@ -232,7 +239,9 @@ debug_realloc(const char *file, unsigned line, const char *function, new_ftr = footer_from_header(new_hdr); new_ftr->magic = DEBUG_MEMORY_MAGIC; + pipe_mutex_lock(list_mutex); LIST_REPLACE(&old_hdr->head, &new_hdr->head); + pipe_mutex_unlock(list_mutex); /* copy data */ new_ptr = data_from_header(new_hdr); -- 2.30.2