Author: Maciej Fijalkowski <fij...@gmail.com> Branch: lightweight-finalizers Changeset: r47720:3ed151f19bd2 Date: 2011-09-30 11:56 -0300 http://bitbucket.org/pypy/pypy/changeset/3ed151f19bd2/
Log: implement in minimark 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 @@ -297,6 +297,10 @@ # created after it. self.young_objects_with_weakrefs = self.AddressStack() self.old_objects_with_weakrefs = self.AddressStack() + # This is a list for objects that are in the nursery and + # own some raw memory. Note that young objects which are raw_malloced + # won't go there + self.young_objects_with_raw_mem = self.AddressStack() # # Support for id and identityhash: map nursery objects with # GCFLAG_HAS_SHADOW to their future location at the next @@ -499,6 +503,8 @@ # If it is a weakref, record it (check constant-folded). if contains_weakptr: self.young_objects_with_weakrefs.append(result+size_gc_header) + if self.has_raw_mem_ptr(typeid): + self.young_objects_with_raw_mem.append(result + size_gc_header) # obj = result + size_gc_header # @@ -1264,6 +1270,8 @@ # weakrefs' targets. if self.young_objects_with_weakrefs.non_empty(): self.invalidate_young_weakrefs() + if self.young_objects_with_raw_mem.non_empty(): + self.invalidate_young_raw_mem() # # Clear this mapping. if self.nursery_objects_shadows.length() > 0: @@ -1648,6 +1656,8 @@ self.header(obj).tid &= ~GCFLAG_VISITED return False # survives else: + if self.has_raw_mem_ptr(self.get_type_id(obj)): + self._free_raw_mem_from(obj) return True # dies def _reset_gcflag_visited(self, obj, ignored): @@ -1677,6 +1687,8 @@ arena -= extra_words * WORD allocsize += extra_words * WORD # + if self.has_raw_mem_ptr(obj): + self._free_raw_mem_from(obj) llarena.arena_free(arena) self.rawmalloced_total_size -= allocsize @@ -1957,7 +1969,6 @@ # self.old_objects_with_weakrefs.append(obj) - def invalidate_old_weakrefs(self): """Called during a major collection.""" # walk over list of objects that contain weakrefs @@ -1976,6 +1987,12 @@ self.old_objects_with_weakrefs.delete() self.old_objects_with_weakrefs = new_with_weakref + def invalidate_young_raw_mem(self): + while self.young_objects_with_raw_mem.non_empty(): + addr = self.young_objects_with_raw_mem.pop() + if self.header(addr).tid & GCFLAG_VISITED == 0: + self._free_raw_mem_from(addr) + # ____________________________________________________________ _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit