diff options
-rw-r--r-- | CMakeLists.txt | 4 | ||||
-rw-r--r-- | source/blender/blenlib/CMakeLists.txt | 4 | ||||
-rw-r--r-- | source/blender/blenlib/intern/BLI_mempool.c | 20 |
3 files changed, 28 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index eed1d64459f..91003a1964a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -278,6 +278,10 @@ mark_as_advanced(LLVM_STATIC) option(WITH_MEM_JEMALLOC "Enable malloc replacement (http://www.canonware.com/jemalloc)" OFF) mark_as_advanced(WITH_MEM_JEMALLOC) +# currently only used for BLI_mempool +option(WITH_MEM_VALGRIND "Enable extended valgrind support for better reporting" OFF) +mark_as_advanced(WITH_MEM_VALGRIND) + # Debug option(WITH_CXX_GUARDEDALLOC "Enable GuardedAlloc for C++ memory allocation tracking (only enable for development)" OFF) mark_as_advanced(WITH_CXX_GUARDEDALLOC) diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt index 31125fd3153..65ba545ef13 100644 --- a/source/blender/blenlib/CMakeLists.txt +++ b/source/blender/blenlib/CMakeLists.txt @@ -178,6 +178,10 @@ if(WITH_BINRELOC) add_definitions(-DWITH_BINRELOC) endif() +if(WITH_MEM_VALGRIND) + add_definitions(-DWITH_MEM_VALGRIND) +endif() + if(WIN32) list(APPEND INC ../../../intern/utfconv diff --git a/source/blender/blenlib/intern/BLI_mempool.c b/source/blender/blenlib/intern/BLI_mempool.c index febf09745fb..8301a7df35b 100644 --- a/source/blender/blenlib/intern/BLI_mempool.c +++ b/source/blender/blenlib/intern/BLI_mempool.c @@ -45,6 +45,9 @@ #include "BLI_strict_flags.h" /* keep last */ +#ifdef WITH_MEM_VALGRIND +# include "valgrind/memcheck.h" +#endif /* note: copied from BLO_blend_defs.h, don't use here because we're in BLI */ #ifdef __BIG_ENDIAN__ @@ -275,6 +278,10 @@ BLI_mempool *BLI_mempool_create(unsigned int esize, unsigned int totelem, lasttail = mempool_chunk_add(pool, mpchunk, lasttail); } +#ifdef WITH_MEM_VALGRIND + VALGRIND_CREATE_MEMPOOL(pool, 0, false); +#endif + return pool; } @@ -297,6 +304,11 @@ void *BLI_mempool_alloc(BLI_mempool *pool) } pool->free = pool->free->next; + +#ifdef WITH_MEM_VALGRIND + VALGRIND_MEMPOOL_ALLOC(pool, retval, pool->esize); +#endif + return retval; } @@ -367,6 +379,10 @@ void BLI_mempool_free(BLI_mempool *pool, void *addr) } curnode->next = NULL; /* terminate the list */ } + +#ifdef WITH_MEM_VALGRIND + VALGRIND_MEMPOOL_FREE(pool, addr); +#endif } int BLI_mempool_count(BLI_mempool *pool) @@ -582,6 +598,10 @@ void BLI_mempool_destroy(BLI_mempool *pool) { mempool_chunk_free_all(&pool->chunks, pool->flag); +#ifdef WITH_MEM_VALGRIND + VALGRIND_DESTROY_MEMPOOL(pool); +#endif + if (pool->flag & BLI_MEMPOOL_SYSMALLOC) { free(pool); } |