[pypy-svn] r58685 - pypy/branch/gc-experiments/pypy/rpython/memory/gc

fijal at codespeak.net fijal at codespeak.net
Mon Oct 6 19:01:53 CEST 2008


Author: fijal
Date: Mon Oct  6 19:01:50 2008
New Revision: 58685

Modified:
   pypy/branch/gc-experiments/pypy/rpython/memory/gc/markcompact.py
Log:
Support for clearing memory after we're done


Modified: pypy/branch/gc-experiments/pypy/rpython/memory/gc/markcompact.py
==============================================================================
--- pypy/branch/gc-experiments/pypy/rpython/memory/gc/markcompact.py	(original)
+++ pypy/branch/gc-experiments/pypy/rpython/memory/gc/markcompact.py	Mon Oct  6 19:01:50 2008
@@ -47,6 +47,8 @@
 FREE_SPACE_MULTIPLIER = 3
 FREE_SPACE_DIVIDER = 2
 FREE_SPACE_ADD = 256
+# XXX adjust
+GC_CLEARANCE = 32*1024
 
 class MarkCompactGC(MovingGCBase):
     HDR = lltype.Struct('header', ('tid', lltype.Signed),
@@ -309,6 +311,8 @@
     def compact(self, resizing):
         fromaddr = self.space
         size_gc_header = self.gcheaderbuilder.size_gc_header
+        start = fromaddr
+        end = fromaddr
         while fromaddr < self.free:
             hdr = llmemory.cast_adr_to_ptr(fromaddr, lltype.Ptr(self.HDR))
             obj = fromaddr + size_gc_header
@@ -320,10 +324,26 @@
             else:
                 ll_assert(self.is_forwarded(obj), "not forwarded, surviving obj")
                 forward_ptr = hdr.forward_ptr
+                if resizing:
+                    end = fromaddr
                 hdr.forward_ptr = NULL
                 hdr.tid &= ~(GCFLAG_MARKBIT|GCFLAG_FINALIZATION_ORDERING)
-                #if fromaddr != forward_ptr:
-                llmemory.raw_memmove(fromaddr, forward_ptr, totalsize)
+                if fromaddr != forward_ptr:
+                    #llop.debug_print(lltype.Void, "Copying from to",
+                    #                 fromaddr, forward_ptr, totalsize)
+                    llmemory.raw_memmove(fromaddr, forward_ptr, totalsize)
+                if resizing and end - start > GC_CLEARANCE:
+                    diff = end - start
+                    #llop.debug_print(lltype.Void, "Cleaning", start, diff)
+                    diff = (diff / GC_CLEARANCE) * GC_CLEARANCE
+                    #llop.debug_print(lltype.Void, "Cleaning", start, diff)
+                    end = start + diff
+                    if we_are_translated():
+                        # XXX wuaaaaa.... those objects are freed incorrectly
+                        #                 here in case of test_gc
+                        llarena.arena_reset(start, diff, True)
+                    start += diff
+
             fromaddr += totalsize
 
     def debug_check_object(self, obj):



More information about the Pypy-commit mailing list