[pypy-commit] pypy gc-incminimark-pinning: new test to check if old_objects_pointing_to_pinned isn't growing while

groggi noreply at buildbot.pypy.org
Thu Aug 14 19:05:19 CEST 2014


Author: Gregor Wegberg <code at gregorwegberg.com>
Branch: gc-incminimark-pinning
Changeset: r72808:79000e7c5466
Date: 2014-08-14 16:39 +0200
http://bitbucket.org/pypy/pypy/changeset/79000e7c5466/

Log:	new test to check if old_objects_pointing_to_pinned isn't growing
	while old object pointing to pinned objects stays the same. fails
	right now.

diff --git a/rpython/memory/gc/test/test_object_pinning.py b/rpython/memory/gc/test/test_object_pinning.py
--- a/rpython/memory/gc/test/test_object_pinning.py
+++ b/rpython/memory/gc/test/test_object_pinning.py
@@ -6,7 +6,8 @@
 S = lltype.GcForwardReference()
 S.become(lltype.GcStruct('pinning_test_struct',
                          ('someInt', lltype.Signed),
-                         ('next', lltype.Ptr(S))))
+                         ('next', lltype.Ptr(S)),
+                         ('data', lltype.Ptr(S))))
 
 class PinningGCTest(BaseDirectGCTest):
 
@@ -487,6 +488,41 @@
         self.pin_referenced_from_prebuilt(self.gc.collect)
 
 
+    def test_old_objects_pointing_to_pinned_not_exploading(self):
+        # scenario: two old object, each pointing twice to a pinned object.
+        # The internal 'old_objects_pointing_to_pinned' should contain
+        # always two objects.
+        # In previous implementation the list exploded (grew with every minor
+        # collection), hence this test.
+        old1_ptr = self.malloc(S)
+        old1_ptr.someInt = 900
+        self.stackroots.append(old1_ptr)
+        
+        old2_ptr = self.malloc(S)
+        old2_ptr.someInt = 800
+        self.stackroots.append(old2_ptr)
+        
+        pinned_ptr = self.malloc(S)
+        pinned_ptr.someInt = 100
+        assert self.gc.pin(llmemory.cast_ptr_to_adr(pinned_ptr))
+        
+        self.write(old1_ptr, 'next', pinned_ptr)
+        self.write(old1_ptr, 'data', pinned_ptr)
+        self.write(old2_ptr, 'next', pinned_ptr)
+        self.write(old2_ptr, 'data', pinned_ptr)
+
+        self.gc.collect()
+        old1_ptr = self.stackroots[0]
+        old2_ptr = self.stackroots[1]
+        assert not self.gc.is_in_nursery(llmemory.cast_ptr_to_adr(old1_ptr))
+        assert not self.gc.is_in_nursery(llmemory.cast_ptr_to_adr(old2_ptr))
+
+        # do multiple rounds to make sure
+        for _ in range(10):
+            assert self.gc.old_objects_pointing_to_pinned.length() == 2
+            self.gc.debug_gc_step()
+
+
     def pin_shadow_1(self, collect_func):
         ptr = self.malloc(S)
         adr = llmemory.cast_ptr_to_adr(ptr)


More information about the pypy-commit mailing list