From 8467d86f8aacf54657f247d69b7413a4ce879d6f Mon Sep 17 00:00:00 2001 From: ko1 Date: Wed, 26 Feb 2014 09:46:45 +0000 Subject: [PATCH] * gc.c (heap_pages_free_unused_pages): check tomb page availability at first. And return immediately if we don't touch sorted list any more. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45182 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ gc.c | 36 +++++++++++++++++++----------------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8001871c28..10891e0919 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Wed Feb 26 18:43:43 2014 Koichi Sasada + + * gc.c (heap_pages_free_unused_pages): check tomb page availability + at first. + And return immediately if we don't touch sorted list any more. + Wed Feb 26 14:10:44 2014 Nobuyoshi Nakada * eval.c (setup_exception): preserve exception class name encoding diff --git a/gc.c b/gc.c index a489995971..c6a65ff90a 100644 --- a/gc.c +++ b/gc.c @@ -999,28 +999,30 @@ heap_pages_free_unused_pages(rb_objspace_t *objspace) { size_t i, j; - for (i = j = 1; j < heap_pages_used; i++) { - struct heap_page *page = heap_pages_sorted[i]; + if (heap_tomb->pages) { + for (i = j = 1; j < heap_pages_used; i++) { + struct heap_page *page = heap_pages_sorted[i]; - if (page->heap == heap_tomb && page->final_slots == 0) { - if (heap_pages_swept_slots - page->limit > heap_pages_max_free_slots) { - if (0) fprintf(stderr, "heap_pages_free_unused_pages: %d free page %p, heap_pages_swept_slots: %d, heap_pages_max_free_slots: %d\n", - (int)i, page, (int)heap_pages_swept_slots, (int)heap_pages_max_free_slots); - heap_pages_swept_slots -= page->limit; - heap_unlink_page(objspace, heap_tomb, page); - heap_page_free(objspace, page); - continue; + if (page->heap == heap_tomb && page->final_slots == 0) { + if (heap_pages_swept_slots - page->limit > heap_pages_max_free_slots) { + if (0) fprintf(stderr, "heap_pages_free_unused_pages: %d free page %p, heap_pages_swept_slots: %d, heap_pages_max_free_slots: %d\n", + (int)i, page, (int)heap_pages_swept_slots, (int)heap_pages_max_free_slots); + heap_pages_swept_slots -= page->limit; + heap_unlink_page(objspace, heap_tomb, page); + heap_page_free(objspace, page); + continue; + } + else if (i == j) { + return; /* no need to check rest pages */ + } } - else { - /* fprintf(stderr, "heap_pages_free_unused_pages: remain!!\n"); */ + if (i != j) { + heap_pages_sorted[j] = page; } + j++; } - if (i != j) { - heap_pages_sorted[j] = page; - } - j++; + assert(j == heap_pages_used); } - assert(j == heap_pages_used); } static struct heap_page *