1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-09 23:40:29 +02:00

Allow large object space to be part of remembered set

This commit is contained in:
Andy Wingo 2023-03-15 09:34:12 +01:00
parent d0b8f6838d
commit e270290242
13 changed files with 135 additions and 25 deletions

View file

@ -58,6 +58,49 @@ static size_t large_object_space_npages(struct large_object_space *space,
return (bytes + space->page_size - 1) >> space->page_size_log2;
}
static void large_object_space_clear_one_remembered(uintptr_t addr,
void *unused) {
struct gc_ref ref = gc_ref(addr);
if (gc_object_is_remembered_nonatomic(ref))
gc_object_clear_remembered_nonatomic(ref);
}
static void
large_object_space_clear_remembered_set(struct large_object_space *space) {
if (!GC_GENERATIONAL)
return;
address_set_for_each(&space->to_space,
large_object_space_clear_one_remembered, NULL);
}
struct large_object_space_trace_remembered_data {
void (*trace)(struct gc_ref, struct gc_heap*);
struct gc_heap *heap;
};
static void large_object_space_trace_one_remembered(uintptr_t addr,
void *data) {
struct gc_ref ref = gc_ref(addr);
if (gc_object_is_remembered_nonatomic(ref)) {
gc_object_clear_remembered_nonatomic(ref);
struct large_object_space_trace_remembered_data *vdata = data;
vdata->trace(ref, vdata->heap);
}
}
static void
large_object_space_trace_remembered_set(struct large_object_space *space,
void (*trace)(struct gc_ref,
struct gc_heap*),
struct gc_heap *heap) {
struct large_object_space_trace_remembered_data vdata = { trace, heap };
if (!GC_GENERATIONAL)
return;
address_set_for_each(&space->to_space,
large_object_space_trace_one_remembered, &vdata);
}
static void large_object_space_start_gc(struct large_object_space *space,
int is_minor_gc) {
if (is_minor_gc)