use valgrind hints for memarena for better debugging info when using valgrind.
authorCampbell Barton <ideasman42@gmail.com>
Sat, 5 Oct 2013 04:38:08 +0000 (04:38 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Sat, 5 Oct 2013 04:38:08 +0000 (04:38 +0000)
also quiet a false positive in BLI_mempool_free().

source/blender/blenlib/intern/BLI_memarena.c
source/blender/blenlib/intern/BLI_mempool.c

index 747c2f0c2b7e3486b94f6bf0ee8f70aa0ec55f36..6b845bf842e1ed8934459666790d58bcef22b7ea 100644 (file)
 #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
+
 }
index 067ddf91794e9ec06474d84b1a1ab7bfe8cba10a..b7f90f01c82a111a41ec87584c8212707c5dba7e 100644 (file)
@@ -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)