From 41fe52485793ff23590e7b760737b8390fd8cee1 Mon Sep 17 00:00:00 2001 From: ko1 Date: Wed, 2 Jul 2014 06:47:10 +0000 Subject: * gc.c (gc_heap_lazy_sweep): simplify logic. * gc.c (gc_page_sweep): return TRUE if empty slots are available. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46653 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- gc.c | 51 +++++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 24 deletions(-) (limited to 'gc.c') diff --git a/gc.c b/gc.c index 94a2616c8d..d07d9d3855 100644 --- a/gc.c +++ b/gc.c @@ -2788,7 +2788,9 @@ gc_setup_mark_bits(struct heap_page *page) #endif } -static inline void +/* TRUE : has empty slots */ +/* FALSE: no empty slots (or move to tomb heap because no live slots) */ +static inline int gc_page_sweep(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *sweep_page) { int i; @@ -2858,20 +2860,6 @@ gc_page_sweep(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *sweep_ } #endif - if (final_slots + freed_slots + empty_slots == sweep_page->limit) { - /* there are no living objects -> move this page to tomb heap */ - heap_unlink_page(objspace, heap, sweep_page); - heap_add_page(objspace, heap_tomb, sweep_page); - } - else { - if (freed_slots + empty_slots > 0) { - heap_add_freepage(objspace, heap, sweep_page); - } - else { - sweep_page->free_next = NULL; - } - } - heap_pages_swept_slots += freed_slots + empty_slots; objspace->profile.total_freed_object_num += freed_slots; heap_pages_final_slots += final_slots; @@ -2890,6 +2878,22 @@ gc_page_sweep(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *sweep_ } rgengc_report(1, objspace, "page_sweep: end.\n"); + + if (final_slots + freed_slots + empty_slots == sweep_page->limit) { + /* there are no living objects -> move this page to tomb heap */ + heap_unlink_page(objspace, heap, sweep_page); + heap_add_page(objspace, heap_tomb, sweep_page); + } + else { + if (freed_slots + empty_slots > 0) { + return TRUE; /* has empty slots */ + } + else { + sweep_page->free_next = NULL; + } + } + + return FALSE; } /* allocate additional minimum page to work */ @@ -3089,7 +3093,6 @@ static int gc_heap_lazy_sweep(rb_objspace_t *objspace, rb_heap_t *heap) { struct heap_page *page = heap->sweep_pages, *next; - int result = FALSE; if (page == NULL) return FALSE; @@ -3100,23 +3103,23 @@ gc_heap_lazy_sweep(rb_objspace_t *objspace, rb_heap_t *heap) while (page) { heap->sweep_pages = next = page->next; - gc_page_sweep(objspace, heap, page); - - if (!next) gc_after_sweep(objspace); - - if (heap->free_pages) { - result = TRUE; + if (gc_page_sweep(objspace, heap, page)) { + heap_add_freepage(objspace, heap, page); break; - } + } page = next; } + if (heap->sweep_pages == NULL) { + gc_after_sweep(objspace); + } + #if GC_ENABLE_LAZY_SWEEP gc_prof_sweep_timer_stop(objspace); #endif - return result; + return heap->free_pages != NULL; } static void -- cgit v1.2.3