[pypy-commit] pypy gc-incminimark-pinning: extended and corrected pinning tests to represent the current approach

groggi noreply at buildbot.pypy.org
Mon Jun 2 17:24:12 CEST 2014


Author: Gregor Wegberg <code at gregorwegberg.com>
Branch: gc-incminimark-pinning
Changeset: r71830:ca3298f5878c
Date: 2014-05-20 13:36 +0200
http://bitbucket.org/pypy/pypy/changeset/ca3298f5878c/

Log:	extended and corrected pinning tests to represent the current
	approach

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
@@ -122,8 +122,13 @@
         ptr.someInt = 100
         assert self.gc.pin(adr)
         self.gc.id(ptr) # allocate shadow
-        self.gc.collect()
+        self.gc.minor_collection()
+        assert self.gc.is_in_nursery(adr)
         assert ptr.someInt == 100
+        self.gc.unpin(adr)
+        self.gc.minor_collection() # move to shadow
+        adr = llmemory.cast_ptr_to_adr(self.stackroots[0])
+        assert not self.gc.is_in_nursery(adr)
 
     def test_pin_shadow_2(self):
         ptr = self.malloc(S)
@@ -132,29 +137,39 @@
         ptr.someInt = 100
         assert self.gc.pin(adr)
         self.gc.identityhash(ptr) # allocate shadow
-        self.gc.collect()
+        self.gc.minor_collection()
+        assert self.gc.is_in_nursery(adr)
         assert ptr.someInt == 100
+        self.gc.unpin(adr)
+        self.gc.minor_collection() # move to shadow
+        adr = llmemory.cast_ptr_to_adr(self.stackroots[0])
+        assert not self.gc.is_in_nursery(adr)
 
     def test_pin_shadow_3(self):
-        s = self.malloc(S)
-        self.stackroots.append(s)
-        self.gc.id(s) # allocate shadow
-        self.gc.pin(llmemory.cast_ptr_to_adr(s))
-        
-        print("free: %s" % self.gc.nursery_free)
-        print("top: %s" % self.gc.nursery_top)
+        ptr = self.malloc(S)
+        adr = llmemory.cast_ptr_to_adr(ptr)
+        ptr.someInt = 100 # not used, just nice to have for identification
+        self.stackroots.append(ptr)
+        self.gc.id(ptr) # allocate shadow
+
+        assert self.gc.pin(adr)
+        self.gc.minor_collection() # object stays in nursery
+        assert self.gc.is_in_nursery(adr)
+
+        self.gc.unpin(adr)
+        # we still have a pinned object at the beginning. There is no space left
+        # to malloc an object before the pinned one.
+        assert self.gc.is_in_nursery(adr)
+        assert self.gc.nursery_free == self.gc.nursery
+        assert self.gc.nursery_top == self.gc.nursery
+
         self.gc.minor_collection()
-        # XXX it seems like we adjust nursery_free wrong after the minor
-        # collection or there is some other bug. (groggi)
-        print("free: %s" % self.gc.nursery_free)
-        print("top: %s" % self.gc.nursery_top)
-
-        self.gc.unpin(llmemory.cast_ptr_to_adr(s))
-        assert self.gc.nursery_free != self.gc.nursery
-        # we still have a pinned object
-        self.gc.minor_collection()
+        # we don't have a pinned object any more.  There is now space left at
+        # the beginning of our nursery for new objects.
+        adr = llmemory.cast_ptr_to_adr(self.stackroots[0])
+        assert not self.gc.is_in_nursery(adr)
         assert self.gc.nursery_free == self.gc.nursery
-        # we don't have a pinned object any more
+        assert self.gc.nursery_top > self.gc.nursery
 
     # XXX test/define what happens if we try to pin an object that is too
     # big for the nursery and will be raw-malloc'ed.


More information about the pypy-commit mailing list