From 542eda83abda4bcbc6ac7fa28a5ed8ae28ccb9bb Mon Sep 17 00:00:00 2001 From: Narihiro Nakamura Date: Mon, 7 Jan 2013 11:54:23 +0900 Subject: Skip sweeping old slots which don't contain any young object. --- src/gc.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src/gc.c') diff --git a/src/gc.c b/src/gc.c index 472535925..b843786d3 100644 --- a/src/gc.c +++ b/src/gc.c @@ -206,6 +206,7 @@ struct heap_page { struct heap_page *next; struct heap_page *free_next; struct heap_page *free_prev; + unsigned int old:1; RVALUE objects[MRB_HEAP_PAGE_SIZE]; }; @@ -762,6 +763,11 @@ incremental_sweep_phase(mrb_state *mrb, size_t limit) int dead_slot = 1; int full = (page->freelist == NULL); + if (is_minor_gc(mrb) && page->old) { + /* skip a slot which doesn't contain any young object */ + p = e; + dead_slot = 0; + } while (pas.basic)) { if (p->as.basic.tt != MRB_TT_FREE) { @@ -792,6 +798,10 @@ incremental_sweep_phase(mrb_state *mrb, size_t limit) if (full && freed > 0) { link_free_heap_page(mrb, page); } + if (page->freelist == NULL && is_minor_gc(mrb)) + page->old = TRUE; + else + page->old = FALSE; page = page->next; } tried_sweep += MRB_HEAP_PAGE_SIZE; -- cgit v1.2.3