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/