summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-02-26 09:46:45 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-02-26 09:46:45 +0000
commit8467d86f8aacf54657f247d69b7413a4ce879d6f (patch)
tree792c05f754eb5e09140d18ace24693aeac9281c6
parenta8cb9b02a0ad6c9bb656ce5154c5483de36f5b12 (diff)
* 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
-rw-r--r--ChangeLog6
-rw-r--r--gc.c38
2 files changed, 26 insertions, 18 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 <ko1@atdot.net>
+
+ * 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 <nobu@ruby-lang.org>
* 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 (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 *