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

ruby-changes:55414

From: tenderlove <ko1@a...>
Date: Sat, 20 Apr 2019 10:59:39 +0900 (JST)
Subject: [ruby-changes:55414] tenderlove:r67623 (trunk): Try harder to make objects move

tenderlove	2019-04-20 10:59:34 +0900 (Sat, 20 Apr 2019)

  New Revision: 67623

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

  Log:
    Try harder to make objects move
    
    Sometimes the objects we allocated may not get compacted.  This change
    is to increase the likelyhood that they will move

  Modified files:
    trunk/test/ruby/test_gc_compact.rb
Index: test/ruby/test_gc_compact.rb
===================================================================
--- test/ruby/test_gc_compact.rb	(revision 67622)
+++ test/ruby/test_gc_compact.rb	(revision 67623)
@@ -14,12 +14,16 @@ class TestGCCompact < Test::Unit::TestCa https://github.com/ruby/ruby/blob/trunk/test/ruby/test_gc_compact.rb#L14
     list.count - same_count
   end
 
-  def big_list
-    1000.times.map {
-      # try to make some empty slots by allocating an object and discarding
-      Object.new
-      Object.new
-    } # likely next to each other
+  def big_list(level = 10)
+    if level > 0
+      big_list(level - 1)
+    else
+      1000.times.map {
+        # try to make some empty slots by allocating an object and discarding
+        Object.new
+        Object.new
+      } # likely next to each other
+    end
   end
 
   # Find an object that's allocated in a slot that had a previous
@@ -37,31 +41,39 @@ class TestGCCompact < Test::Unit::TestCa https://github.com/ruby/ruby/blob/trunk/test/ruby/test_gc_compact.rb#L41
     new_object
   end
 
-  def test_find_collided_object
-    list_of_objects = big_list
+  def try_to_move_objects
+    10.times do
+      list_of_objects = big_list
 
-    ids       = list_of_objects.map(&:object_id) # store id in map
-    addresses = list_of_objects.map(&self.:memory_location)
+      ids       = list_of_objects.map(&:object_id) # store id in map
+      addresses = list_of_objects.map(&self.:memory_location)
 
-    assert_equal ids, addresses
+      assert_equal ids, addresses
 
-    # All object ids should be equal
-    assert_equal 0, assert_object_ids(list_of_objects) # should be 0
+      # All object ids should be equal
+      assert_equal 0, assert_object_ids(list_of_objects) # should be 0
 
-    GC.verify_compaction_references
+      GC.verify_compaction_references
 
-    # Some should have moved
-    id_count = assert_object_ids(list_of_objects)
-    skip "couldn't get objects to move" if id_count == 0
-    assert_operator id_count, :>, 0
+      # Some should have moved
+      id_count = assert_object_ids(list_of_objects)
+      skip "couldn't get objects to move" if id_count == 0
+      assert_operator id_count, :>, 0
 
-    new_ids = list_of_objects.map(&:object_id)
+      new_ids = list_of_objects.map(&:object_id)
 
-    # Object ids should not change after compaction
-    assert_equal ids, new_ids
+      # Object ids should not change after compaction
+      assert_equal ids, new_ids
+
+      new_tenant = find_object_in_recycled_slot(addresses)
+      return [list_of_objects, addresses, new_tenant] if new_tenant
+    end
 
-    new_tenant = find_object_in_recycled_slot(addresses)
-    assert new_tenant
+    flunk "Couldn't get objects to move"
+  end
+
+  def test_find_collided_object
+    list_of_objects, addresses, new_tenant = try_to_move_objects
 
     # This is the object that used to be in new_object's position
     previous_tenant = list_of_objects[addresses.index(memory_location(new_tenant))]

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

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