1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-07 04:30:18 +02:00

Trim remembered-set during minor GC

When visiting remembered-set roots, if the target is no longer in
newspace, forget the edge.
This commit is contained in:
Andy Wingo 2025-01-15 22:31:48 +01:00
parent cc68a9a610
commit 685c63ab3a
4 changed files with 52 additions and 10 deletions

View file

@ -264,6 +264,13 @@ tracer_visit(struct gc_edge edge, struct gc_heap *heap, void *trace_data) {
gc_trace_worker_enqueue(worker, gc_edge_ref(edge));
}
static inline int
trace_remembered_edge(struct gc_edge edge, struct gc_heap *heap, void *trace_data) {
tracer_visit(edge, heap, trace_data);
// Keep the edge in the remembered set; we clear these in bulk later.
return 1;
}
static inline struct gc_ref
do_trace_conservative_ref(struct gc_heap *heap, struct gc_conservative_ref ref,
int possibly_interior) {
@ -380,7 +387,7 @@ trace_root(struct gc_root root, struct gc_heap *heap,
break;
case GC_ROOT_KIND_EDGE_BUFFER:
gc_field_set_visit_edge_buffer(&heap->remembered_set, root.edge_buffer,
tracer_visit, heap, worker);
trace_remembered_edge, heap, worker);
break;
default:
GC_CRASH();