From 9b90fd4f6099a2e714f0f473f819f22c78e129ef Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sun, 10 Sep 2023 22:39:24 +0900 Subject: [PATCH] gc.c (incremental_sweep_phase): rebuild free pages link only if needed --- src/gc.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/gc.c b/src/gc.c index ad491a30e..c94f6c5e6 100644 --- a/src/gc.c +++ b/src/gc.c @@ -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; + } } }