[freelist] valgrindify freed blocks

Mark freed blocks as unaccessible upon free() and then as undefined
on alloc().
This commit is contained in:
Chris Wilson 2009-06-03 21:52:02 +01:00
parent 4e11d56f8e
commit e89828c533

View file

@ -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));
}
}