gc.c (incremental_sweep_phase): rebuild free pages link only if needed

This commit is contained in:
Yukihiro "Matz" Matsumoto
2023-09-10 22:39:24 +09:00
parent 9f840e111a
commit 9b90fd4f60
+9 -5
View File
@@ -1066,6 +1066,7 @@ incremental_sweep_phase(mrb_state *mrb, mrb_gc *gc, size_t limit)
{
mrb_heap_page *page = gc->sweeps;
size_t tried_sweep = 0;
mrb_bool rebuild = FALSE;
while (page && (tried_sweep < limit)) {
RVALUE *p = objects(page);
@@ -1114,6 +1115,7 @@ incremental_sweep_phase(mrb_state *mrb, mrb_gc *gc, size_t limit)
mrb_free(mrb, page);
page = next;
rebuild = TRUE;
}
else {
if (page->freelist == NULL && is_minor_gc(gc))
@@ -1129,11 +1131,13 @@ incremental_sweep_phase(mrb_state *mrb, mrb_gc *gc, size_t limit)
gc->sweeps = page;
/* rebuild free_heaps link */
gc->free_heaps = NULL;
for (mrb_heap_page *p = gc->heaps; p; p=p->next) {
if (p->freelist) {
p->free_next = gc->free_heaps;
gc->free_heaps = p;
if (rebuild) {
gc->free_heaps = NULL;
for (mrb_heap_page *p = gc->heaps; p; p=p->next) {
if (p->freelist) {
p->free_next = gc->free_heaps;
gc->free_heaps = p;
}
}
}