Author: Maciej Fijalkowski <fij...@gmail.com> Branch: gc-minimark-pinning Changeset: r54595:13aecb5e5a44 Date: 2012-04-20 19:44 +0200 http://bitbucket.org/pypy/pypy/changeset/13aecb5e5a44/
Log: finish support for pinned objects with shadows diff --git a/pypy/rpython/memory/gc/minimark.py b/pypy/rpython/memory/gc/minimark.py --- a/pypy/rpython/memory/gc/minimark.py +++ b/pypy/rpython/memory/gc/minimark.py @@ -1262,6 +1262,12 @@ self.old_objects_with_cards_set.append(dest_addr) dest_hdr.tid |= GCFLAG_CARDS_SET + def record_pinned_object(self, obj, new_dict): + obj = obj + self.gcheaderbuilder.size_gc_header + shadow = self.nursery_objects_shadows.get(obj) + if shadow != NULL: + new_dict.setitem(obj, shadow) + # ---------- # Nursery collection @@ -1318,7 +1324,14 @@ # # Clear this mapping. if self.nursery_objects_shadows.length() > 0: - self.nursery_objects_shadows.clear() + if self.surviving_pinned_objects.non_empty(): + new_shadows = self.AddressDict() + self.surviving_pinned_objects.foreach(self.record_pinned_object, + new_shadows) + self.nursery_objects_shadows.delete() + self.nursery_objects_shadows = new_shadows + else: + self.nursery_objects_shadows.clear() # # Walk the list of young raw-malloced objects, and either free # them or make them old. diff --git a/pypy/rpython/memory/gc/test/test_direct.py b/pypy/rpython/memory/gc/test/test_direct.py --- a/pypy/rpython/memory/gc/test/test_direct.py +++ b/pypy/rpython/memory/gc/test/test_direct.py @@ -542,9 +542,11 @@ self.gc.pin(llmemory.cast_ptr_to_adr(s)) self.gc.minor_collection(1) self.gc.unpin(llmemory.cast_ptr_to_adr(s)) - self.gc.minor_collection(1) assert self.gc.nursery_free != self.gc.nursery # we still have a pinned object + self.gc.minor_collection(1) + assert self.gc.nursery_free == self.gc.nursery + # we don't have a pinned object any more def test_writebarrier_before_copy(self): from pypy.rpython.memory.gc import minimark _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit