diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2009-06-03 21:52:02 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2009-06-04 12:50:39 +0100 |
commit | e89828c5331579d0d4019b6339df09ba1e2aa32e (patch) | |
tree | 3affd8ecca90639ffd8836413c54818d1294873a /src/cairo-freelist.c | |
parent | 4e11d56f8e5f409ea2476315c9d67116b213b738 (diff) | |
download | cairo-e89828c5331579d0d4019b6339df09ba1e2aa32e.tar.gz |
[freelist] valgrindify freed blocks
Mark freed blocks as unaccessible upon free() and then as undefined
on alloc().
Diffstat (limited to 'src/cairo-freelist.c')
-rw-r--r-- | src/cairo-freelist.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/cairo-freelist.c b/src/cairo-freelist.c index 3887f4b5f..e39a01e4a 100644 --- a/src/cairo-freelist.c +++ b/src/cairo-freelist.c @@ -24,10 +24,17 @@ #include "cairo-freelist-private.h" +#if HAVE_VALGRIND +#include <memcheck.h> +#define VG(x) x +#else +#define VG(x) +#endif + void _cairo_freelist_init (cairo_freelist_t *freelist, unsigned nodesize) { - memset (freelist, 0, sizeof(cairo_freelist_t)); + memset (freelist, 0, sizeof (cairo_freelist_t)); freelist->nodesize = nodesize; } @@ -36,7 +43,11 @@ _cairo_freelist_fini (cairo_freelist_t *freelist) { cairo_freelist_node_t *node = freelist->first_free_node; while (node) { - cairo_freelist_node_t *next = node->next; + cairo_freelist_node_t *next; + + VG (VALGRIND_MAKE_MEM_DEFINED (node, sizeof (node->next))); + next = node->next; + free (node); node = next; } @@ -46,10 +57,16 @@ void * _cairo_freelist_alloc (cairo_freelist_t *freelist) { if (freelist->first_free_node) { - cairo_freelist_node_t *node = freelist->first_free_node; + cairo_freelist_node_t *node; + + node = freelist->first_free_node; + VG (VALGRIND_MAKE_MEM_DEFINED (node, sizeof (node->next))); freelist->first_free_node = node->next; - return (void*)node; + VG (VALGRIND_MAKE_MEM_UNDEFINED (node, freelist->nodesize)); + + return node; } + return malloc (freelist->nodesize); } @@ -69,5 +86,6 @@ _cairo_freelist_free (cairo_freelist_t *freelist, void *voidnode) if (node) { node->next = freelist->first_free_node; freelist->first_free_node = node; + VG (VALGRIND_MAKE_MEM_NOACCESS (node, freelist->nodesize)); } } |