diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-10-05 08:38:08 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-10-05 08:38:08 +0400 |
commit | 2621d77f393b5c92111fc422eea83f6252f99464 (patch) | |
tree | b8ecc507e02e2bb0cf46b0a2b66829b3a2326626 /source/blender/blenlib | |
parent | 7a9bc838de58c306afc33c7d0dd158af655817e6 (diff) |
use valgrind hints for memarena for better debugging info when using valgrind.
also quiet a false positive in BLI_mempool_free().
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r-- | source/blender/blenlib/intern/BLI_memarena.c | 18 | ||||
-rw-r--r-- | source/blender/blenlib/intern/BLI_mempool.c | 14 |
2 files changed, 29 insertions, 3 deletions
diff --git a/source/blender/blenlib/intern/BLI_memarena.c b/source/blender/blenlib/intern/BLI_memarena.c index 747c2f0c2b7..6b845bf842e 100644 --- a/source/blender/blenlib/intern/BLI_memarena.c +++ b/source/blender/blenlib/intern/BLI_memarena.c @@ -38,6 +38,10 @@ #include "BLI_linklist.h" #include "BLI_strict_flags.h" +#ifdef WITH_MEM_VALGRIND +# include "valgrind/memcheck.h" +#endif + struct MemArena { unsigned char *curbuf; int bufsize, cursize; @@ -56,6 +60,10 @@ MemArena *BLI_memarena_new(const int bufsize, const char *name) ma->align = 8; ma->name = name; +#ifdef WITH_MEM_VALGRIND + VALGRIND_CREATE_MEMPOOL(ma, 0, false); +#endif + return ma; } @@ -122,6 +130,10 @@ void *BLI_memarena_alloc(MemArena *ma, int size) ma->curbuf += size; ma->cursize -= size; +#ifdef WITH_MEM_VALGRIND + VALGRIND_MEMPOOL_ALLOC(ma, ptr, size); +#endif + return ptr; } @@ -152,4 +164,10 @@ void BLI_memarena_clear(MemArena *ma) memset(ma->curbuf, 0, (size_t)curbuf_used); } } + +#ifdef WITH_MEM_VALGRIND + VALGRIND_DESTROY_MEMPOOL(ma); + VALGRIND_CREATE_MEMPOOL(ma, 0, false); +#endif + } diff --git a/source/blender/blenlib/intern/BLI_mempool.c b/source/blender/blenlib/intern/BLI_mempool.c index 067ddf91794..b7f90f01c82 100644 --- a/source/blender/blenlib/intern/BLI_mempool.c +++ b/source/blender/blenlib/intern/BLI_mempool.c @@ -366,8 +366,12 @@ void BLI_mempool_free(BLI_mempool *pool, void *addr) pool->totused--; +#ifdef WITH_MEM_VALGRIND + VALGRIND_MEMPOOL_FREE(pool, addr); +#endif + /* nothing is in use; free all the chunks except the first */ - if (pool->totused == 0) { + if (UNLIKELY(pool->totused == 0)) { BLI_freenode *curnode = NULL; char *tmpaddr = NULL; unsigned int i; @@ -380,6 +384,10 @@ void BLI_mempool_free(BLI_mempool *pool, void *addr) pool->totalloc = pool->pchunk; #endif + /* temp alloc so valgrind doesn't complain when setting free'd blocks 'next' */ +#ifdef WITH_MEM_VALGRIND + VALGRIND_MEMPOOL_ALLOC(pool, CHUNK_DATA(first), pool->csize); +#endif pool->free = CHUNK_DATA(first); /* start of the list */ for (tmpaddr = CHUNK_DATA(first), i = 0; i < pool->pchunk; i++) { curnode = ((BLI_freenode *)tmpaddr); @@ -387,11 +395,11 @@ void BLI_mempool_free(BLI_mempool *pool, void *addr) curnode->next = (BLI_freenode *)tmpaddr; } curnode->next = NULL; /* terminate the list */ - } #ifdef WITH_MEM_VALGRIND - VALGRIND_MEMPOOL_FREE(pool, addr); + VALGRIND_MEMPOOL_FREE(pool, CHUNK_DATA(first)); #endif + } } int BLI_mempool_count(BLI_mempool *pool) |