[pypy-svn] r68756 - in pypy/branch/gc-dump-heap/pypy/rpython/memory: gc test

fijal at codespeak.net fijal at codespeak.net
Mon Oct 26 16:12:47 CET 2009


Author: fijal
Date: Mon Oct 26 16:12:46 2009
New Revision: 68756

Modified:
   pypy/branch/gc-dump-heap/pypy/rpython/memory/gc/generation.py
   pypy/branch/gc-dump-heap/pypy/rpython/memory/gc/semispace.py
   pypy/branch/gc-dump-heap/pypy/rpython/memory/test/test_transformed_gc.py
Log:
Fix generation gc, improve test and fix so we don't track the same object
twice (although we do track links multiple times, but that's unavoidable)


Modified: pypy/branch/gc-dump-heap/pypy/rpython/memory/gc/generation.py
==============================================================================
--- pypy/branch/gc-dump-heap/pypy/rpython/memory/gc/generation.py	(original)
+++ pypy/branch/gc-dump-heap/pypy/rpython/memory/gc/generation.py	Mon Oct 26 16:12:46 2009
@@ -517,6 +517,17 @@
     def _id_grow_older(self, obj, id, ignored):
         self.objects_with_id.setitem(obj, id)
 
+    def dump_heap_walk_roots(self):
+        self.last_generation_root_objects.foreach(
+            self._track_heap_ext, None)
+        self.root_walker.walk_roots(
+            SemiSpaceGC._track_heap_root,
+            SemiSpaceGC._track_heap_root,
+            SemiSpaceGC._track_heap_root)
+
+    def _track_heap_ext(self, adr, ignored):
+        self.trace(adr, self.track_heap_parent, adr)
+
     def debug_check_object(self, obj):
         """Check the invariants about 'obj' that should be true
         between collections."""
@@ -570,6 +581,7 @@
         else:
             SemiSpaceGC.debug_check_can_copy(self, obj)
 
+
 # ____________________________________________________________
 
 import os

Modified: pypy/branch/gc-dump-heap/pypy/rpython/memory/gc/semispace.py
==============================================================================
--- pypy/branch/gc-dump-heap/pypy/rpython/memory/gc/semispace.py	(original)
+++ pypy/branch/gc-dump-heap/pypy/rpython/memory/gc/semispace.py	Mon Oct 26 16:12:46 2009
@@ -637,29 +637,40 @@
             #
             return llmemory.cast_adr_to_int(obj)  # direct case
 
-    def _dump_heap_extraarg(self, addr, parent):
+    def track_heap_parent(self, obj, parent):
+        addr = obj.address[0]
         parent_idx = llop.get_member_index(lltype.Signed,
                                            self.get_type_id(parent))
-        idx = llop.get_member_index(lltype.Signed,
-                                    self.get_type_id(addr.address[0]))
+        idx = llop.get_member_index(lltype.Signed, self.get_type_id(addr))
         self._ll_typeid_map[parent_idx].links[idx] += 1
-        self._dump_heap(addr)
+        self.track_heap(addr)
 
-    def _dump_heap(self, root):
-        adr = root.address[0]
+    def track_heap(self, adr):
+        if self._tracked_dict.contains(adr):
+            return
+        llop.debug_print(lltype.Void, adr)
+        self._tracked_dict.add(adr)
         idx = llop.get_member_index(lltype.Signed, self.get_type_id(adr))
         self._ll_typeid_map[idx].count += 1
-        self.trace(adr, self._dump_heap_extraarg, adr)
+        self.trace(adr, self.track_heap_parent, adr)
 
+    def _track_heap_root(self, root):
+        self.track_heap(root.address[0])
+
+    def dump_heap_walk_roots(self):
+        self.root_walker.walk_roots(
+            SemiSpaceGC._track_heap_root,
+            SemiSpaceGC._track_heap_root,
+            SemiSpaceGC._track_heap_root)
+        
     def dump_heap(self):
+        self._tracked_dict = self.AddressDict()
         max_tid = self.root_walker.gcdata.max_type_id
         ll_typeid_map = lltype.malloc(ARRAY_TYPEID_MAP, max_tid, zero=True)
         for i in range(max_tid):
             ll_typeid_map[i] = lltype.malloc(TYPEID_MAP, max_tid, zero=True)
         self._ll_typeid_map = ll_typeid_map
-        self.root_walker.walk_roots(
-            SemiSpaceGC._dump_heap,  # stack roots
-            SemiSpaceGC._dump_heap,  # static in prebuilt non-gc structures
-            SemiSpaceGC._dump_heap)  # static in prebuilt gc objects
+        self.dump_heap_walk_roots()
         self._ll_typeid_map = lltype.nullptr(ARRAY_TYPEID_MAP)
+        self._tracked_dict.delete()
         return ll_typeid_map

Modified: pypy/branch/gc-dump-heap/pypy/rpython/memory/test/test_transformed_gc.py
==============================================================================
--- pypy/branch/gc-dump-heap/pypy/rpython/memory/test/test_transformed_gc.py	(original)
+++ pypy/branch/gc-dump-heap/pypy/rpython/memory/test/test_transformed_gc.py	Mon Oct 26 16:12:46 2009
@@ -799,13 +799,21 @@
 
     def define_gc_dump_heap(cls):
         S = lltype.GcStruct('S', ('x', lltype.Signed))
-        l = []
+        l1 = []
+        l2 = []
+        l3 = []
+        l4 = []
         
         def f():
             for i in range(10):
-                l.append(lltype.malloc(S))
+                s = lltype.malloc(S)
+                l1.append(s)
+                l2.append(s)
+                l3.append(s)
+                l4.append(s)
             # We cheat here and only read the table which we later on
             # process ourselves, otherwise this test takes ages
+            llop.gc__collect(lltype.Void)
             tb = rgc._dump_heap()
             a = 0
             nr = 0
@@ -816,16 +824,16 @@
                     a += 1
                     nr = i
             for i in range(len(tb)):
-                if tb[i].count == 1:
+                if tb[i].count == 4:
                     b += 1
-                    c = tb[i].links[nr]
+                    c += tb[i].links[nr]
             return c * 100 + b * 10 + a
         return f
 
     def test_gc_dump_heap(self):
         run = self.runner("gc_dump_heap")
         res = run([])
-        assert res == 1011
+        assert res == 4011
         
 # ________________________________________________________________
 



More information about the Pypy-commit mailing list