summaryrefslogtreecommitdiffstats
path: root/gc.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2009-11-25 16:05:45 -0800
committerKaz Kylheku <kaz@kylheku.com>2009-11-25 16:05:45 -0800
commita2dc66961f22df647e0428b1e12bae8a2922c503 (patch)
tree2efa38674b0e219fa93549c6d8d0926333654057 /gc.c
parent3c784ae4f4b25ebcc4019b77c77a7e365fdac261 (diff)
downloadtxr-a2dc66961f22df647e0428b1e12bae8a2922c503.tar.gz
txr-a2dc66961f22df647e0428b1e12bae8a2922c503.tar.bz2
txr-a2dc66961f22df647e0428b1e12bae8a2922c503.zip
Refinements to Valgrind support.
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/gc.c b/gc.c
index a8919390..2ba3231f 100644
--- a/gc.c
+++ b/gc.c
@@ -300,9 +300,17 @@ static void mark_mem_region(val *low, val *high)
VALGRIND_MAKE_MEM_DEFINED(&maybe_obj, sizeof maybe_obj);
#endif
if (in_heap(maybe_obj)) {
+#ifdef HAVE_VALGRIND
+ VALGRIND_MAKE_MEM_DEFINED(maybe_obj, sizeof *maybe_obj);
+#endif
type_t t = maybe_obj->t.type;
- if ((t & FREE) == 0)
+ if ((t & FREE) == 0) {
mark_obj(maybe_obj);
+ } else {
+#ifdef HAVE_VALGRIND
+ VALGRIND_MAKE_MEM_NOACCESS(maybe_obj, sizeof *maybe_obj);
+#endif
+ }
}
low++;
}
@@ -335,6 +343,12 @@ static void sweep(void)
for (heap = heap_list; heap != 0; heap = heap->next) {
obj_t *block, *end;
+
+#ifdef HAVE_VALGRIND
+ if (vg_dbg)
+ VALGRIND_MAKE_MEM_DEFINED(&heap->block, sizeof heap->block);
+#endif
+
for (block = heap->block, end = heap->block + HEAP_SIZE;
block < end;
block++)
@@ -347,8 +361,13 @@ static void sweep(void)
continue;
}
- if (block->t.type & FREE)
+ if (block->t.type & FREE) {
+#ifdef HAVE_VALGRIND
+ if (vg_dbg)
+ VALGRIND_MAKE_MEM_NOACCESS(block, sizeof *block);
+#endif
continue;
+ }
if (0 && gc_dbg) {
format(std_error, lit("~a: finalizing: "), progname, nao);