[前][次][番号順一覧][スレッド一覧]

ruby-changes:47022

From: nobu <ko1@a...>
Date: Thu, 22 Jun 2017 10:00:01 +0900 (JST)
Subject: [ruby-changes:47022] nobu:r59136 (trunk): gc.c: expand sorted pages

nobu	2017-06-22 09:59:54 +0900 (Thu, 22 Jun 2017)

  New Revision: 59136

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=59136

  Log:
    gc.c: expand sorted pages
    
    * gc.c (heap_page_allocate): expand sorted pages before inserting
      allocated new page.  [Bug #12670]

  Modified files:
    trunk/KNOWNBUGS.rb
    trunk/gc.c
    trunk/test/-ext-/typeddata/test_typeddata.rb
Index: test/-ext-/typeddata/test_typeddata.rb
===================================================================
--- test/-ext-/typeddata/test_typeddata.rb	(revision 59135)
+++ test/-ext-/typeddata/test_typeddata.rb	(revision 59136)
@@ -19,8 +19,6 @@ class Test_TypedData < Test::Unit::TestC https://github.com/ruby/ruby/blob/trunk/test/-ext-/typeddata/test_typeddata.rb#L19
   end
 
   def test_deferred_free
-    skip 'not solved'
-
     assert_ruby_status([], "#{<<-"begin;"}\n#{<<-"end;"}")
     require "-test-/typeddata"
     begin;
Index: gc.c
===================================================================
--- gc.c	(revision 59135)
+++ gc.c	(revision 59136)
@@ -1371,6 +1371,29 @@ rb_objspace_free(rb_objspace_t *objspace https://github.com/ruby/ruby/blob/trunk/gc.c#L1371
 }
 
 static void
+heap_pages_expand_sorted_to(rb_objspace_t *objspace, size_t next_length)
+{
+    struct heap_page **sorted;
+    size_t size = next_length * sizeof(struct heap_page *);
+
+    gc_report(3, objspace, "heap_pages_expand_sorted: next_length: %d, size: %d\n", (int)next_length, (int)size);
+
+    if (heap_pages_sorted_length > 0) {
+	sorted = (struct heap_page **)realloc(heap_pages_sorted, size);
+	if (sorted) heap_pages_sorted = sorted;
+    }
+    else {
+	sorted = heap_pages_sorted = (struct heap_page **)malloc(size);
+    }
+
+    if (sorted == 0) {
+	rb_memerror();
+    }
+
+    heap_pages_sorted_length = next_length;
+}
+
+static void
 heap_pages_expand_sorted(rb_objspace_t *objspace)
 {
     size_t next_length = heap_allocatable_pages;
@@ -1378,24 +1401,7 @@ heap_pages_expand_sorted(rb_objspace_t * https://github.com/ruby/ruby/blob/trunk/gc.c#L1401
     next_length += heap_tomb->total_pages;
 
     if (next_length > heap_pages_sorted_length) {
-	struct heap_page **sorted;
-	size_t size = next_length * sizeof(struct heap_page *);
-
-	gc_report(3, objspace, "heap_pages_expand_sorted: next_length: %d, size: %d\n", (int)next_length, (int)size);
-
-	if (heap_pages_sorted_length > 0) {
-	    sorted = (struct heap_page **)realloc(heap_pages_sorted, size);
-	    if (sorted) heap_pages_sorted = sorted;
-	}
-	else {
-	    sorted = heap_pages_sorted = (struct heap_page **)malloc(size);
-	}
-
-	if (sorted == 0) {
-	    rb_memerror();
-	}
-
-	heap_pages_sorted_length = next_length;
+	heap_pages_expand_sorted_to(objspace, next_length);
     }
 }
 
@@ -1533,6 +1539,9 @@ heap_page_allocate(rb_objspace_t *objspa https://github.com/ruby/ruby/blob/trunk/gc.c#L1539
 	    rb_bug("same heap page is allocated: %p at %"PRIuVALUE, (void *)page_body, (VALUE)mid);
 	}
     }
+    if (heap_allocated_pages >= heap_pages_sorted_length) {
+	heap_pages_expand_sorted_to(objspace, heap_allocated_pages + 1);
+    }
     if (hi < heap_allocated_pages) {
 	MEMMOVE(&heap_pages_sorted[hi+1], &heap_pages_sorted[hi], struct heap_page_header*, heap_allocated_pages - hi);
     }
@@ -1542,7 +1551,10 @@ heap_page_allocate(rb_objspace_t *objspa https://github.com/ruby/ruby/blob/trunk/gc.c#L1551
     heap_allocated_pages++;
     objspace->profile.total_allocated_pages++;
 
-    if (RGENGC_CHECK_MODE) assert(heap_allocated_pages <= heap_pages_sorted_length);
+    if (heap_allocated_pages > heap_pages_sorted_length) {
+	rb_bug("heap_page_allocate: allocated(%"PRIdSIZE") > sorted(%"PRIdSIZE")",
+	       heap_allocated_pages, heap_pages_sorted_length);
+    }
 
     if (heap_pages_lomem == 0 || heap_pages_lomem > start) heap_pages_lomem = start;
     if (heap_pages_himem < end) heap_pages_himem = end;
Index: KNOWNBUGS.rb
===================================================================
--- KNOWNBUGS.rb	(revision 59135)
+++ KNOWNBUGS.rb	(revision 59136)
@@ -5,13 +5,3 @@ https://github.com/ruby/ruby/blob/trunk/KNOWNBUGS.rb#L5
 # This test file includes tests which point out known bugs.
 # So all tests will cause failure.
 #
-
-assert_normal_exit("#{<<-";END;"}", timeout: 5)
-begin
-  require "-test-/typeddata"
-rescue LoadError
-else
-  n = 1 << 20
-  Bug::TypedData.make(n)
-end
-;END;

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]