summaryrefslogtreecommitdiff
path: root/src/cairo-freelist.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2009-06-03 21:52:02 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2009-06-04 12:50:39 +0100
commite89828c5331579d0d4019b6339df09ba1e2aa32e (patch)
tree3affd8ecca90639ffd8836413c54818d1294873a /src/cairo-freelist.c
parent4e11d56f8e5f409ea2476315c9d67116b213b738 (diff)
downloadcairo-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.c26
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));
}
}