[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