[pypy-commit] pypy lightweight-finalizers: semispace support

fijal noreply at buildbot.pypy.org
Fri Sep 30 17:34:50 CEST 2011


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: lightweight-finalizers
Changeset: r47717:a71ab91a7f4c
Date: 2011-09-30 11:16 -0300
http://bitbucket.org/pypy/pypy/changeset/a71ab91a7f4c/

Log:	semispace support

diff --git a/pypy/rpython/memory/gc/semispace.py b/pypy/rpython/memory/gc/semispace.py
--- a/pypy/rpython/memory/gc/semispace.py
+++ b/pypy/rpython/memory/gc/semispace.py
@@ -82,6 +82,7 @@
         self.free = self.tospace
         MovingGCBase.setup(self)
         self.objects_with_finalizers = self.AddressDeque()
+        self.objects_with_raw_mem = self.AddressDeque()
         self.objects_with_weakrefs = self.AddressStack()
 
     def _teardown(self):
@@ -104,6 +105,8 @@
         self.free = result + totalsize
         if has_finalizer:
             self.objects_with_finalizers.append(result + size_gc_header)
+        if self.has_raw_mem_ptr(typeid16):
+            self.objects_with_raw_mem.append(result + size_gc_header)
         if contains_weakptr:
             self.objects_with_weakrefs.append(result + size_gc_header)
         return llmemory.cast_adr_to_ptr(result+size_gc_header, llmemory.GCREF)
@@ -265,6 +268,8 @@
         scan = self.scan_copied(scan)
         if self.objects_with_finalizers.non_empty():
             scan = self.deal_with_objects_with_finalizers(scan)
+        if self.objects_with_raw_mem.non_empty():
+            self.deal_with_objects_with_raw_mem()
         if self.objects_with_weakrefs.non_empty():
             self.invalidate_weakrefs()
         self.update_objects_with_id()
@@ -523,6 +528,21 @@
         self.objects_with_finalizers = new_with_finalizer
         return scan
 
+    def deal_with_objects_with_raw_mem(self):
+        new_with_raw_mem = self.AddressDeque()
+        while self.objects_with_raw_mem.non_empty():
+            addr = self.objects_with_raw_mem.popleft()
+            if self.surviving(addr):
+                new_with_raw_mem.append(self.get_forwarding_address(addr))
+            else:
+                typeid = self.get_type_id(addr)
+                p = (addr + self.ofs_to_raw_mem_ptr(typeid)).ptr[0]
+                if p:
+                    lltype.free(p, flavor='raw')
+        self.objects_with_raw_mem.delete()
+        self.objects_with_raw_mem = new_with_raw_mem
+
+
     def _append_if_nonnull(pointer, stack):
         stack.append(pointer.address[0])
     _append_if_nonnull = staticmethod(_append_if_nonnull)


More information about the pypy-commit mailing list