mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
gc.c (incremental_sweep_phase): rebuild free pages link only if needed
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user