diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-02-26 09:46:45 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-02-26 09:46:45 +0000 |
commit | 8467d86f8aacf54657f247d69b7413a4ce879d6f (patch) | |
tree | 792c05f754eb5e09140d18ace24693aeac9281c6 /gc.c | |
parent | a8cb9b02a0ad6c9bb656ce5154c5483de36f5b12 (diff) | |
download | ruby-8467d86f8aacf54657f247d69b7413a4ce879d6f.tar.gz |
* 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
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 38 |
1 files changed, 20 insertions, 18 deletions
@@ -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 (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 (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; + } + 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 * |