[pypy-svn] r76753 - in pypy/branch/markcompact/pypy/rpython/memory/gc: . test

arigo at codespeak.net arigo at codespeak.net
Fri Aug 27 18:55:52 CEST 2010


Author: arigo
Date: Fri Aug 27 18:55:50 2010
New Revision: 76753

Modified:
   pypy/branch/markcompact/pypy/rpython/memory/gc/markcompact.py
   pypy/branch/markcompact/pypy/rpython/memory/gc/test/test_direct.py
Log:
Some more passing tests.  Refactored the computation of next_collect_after.


Modified: pypy/branch/markcompact/pypy/rpython/memory/gc/markcompact.py
==============================================================================
--- pypy/branch/markcompact/pypy/rpython/memory/gc/markcompact.py	(original)
+++ pypy/branch/markcompact/pypy/rpython/memory/gc/markcompact.py	Fri Aug 27 18:55:50 2010
@@ -85,18 +85,25 @@
     total_collection_count = 0
 
     def __init__(self, config, chunk_size=DEFAULT_CHUNK_SIZE, space_size=4096,
-                 min_next_collect_after=64):
+                 min_next_collect_after=128):
         MovingGCBase.__init__(self, config, chunk_size)
         self.space_size = space_size
         self.min_next_collect_after = min_next_collect_after
 
-    def next_collection(self, used_space, num_objects_so_far):
+    def next_collection(self, used_space, num_objects_so_far, requested_size):
         used_space += BYTES_PER_TID * num_objects_so_far
-        next = (used_space // 3) * 2
+        ll_assert(used_space <= self.space_size,
+                  "used_space + num_objects_so_far overflow")
+        try:
+            next = ((used_space + requested_size) // 3) * 2
+        except OverflowError:
+            next = self.space_size
         if next < self.min_next_collect_after:
             next = self.min_next_collect_after
-        if used_space + next > self.space_size:
+        if next > self.space_size - used_space:
             next = self.space_size - used_space
+        # the value we return guarantees that used_space + next <= space_size,
+        # with 'BYTES_PER_TID*num_objects_so_far' included in used_space
         return next
 
     def setup(self):
@@ -104,7 +111,7 @@
         if envsize >= 4096:
             self.space_size = envsize & ~4095
 
-        self.next_collect_after = self.next_collection(0, 0)
+        self.next_collect_after = self.next_collection(0, 0, 0)
 
         self.program_start_time = time.time()
         self.space = llarena.arena_malloc(self.space_size, False)
@@ -180,14 +187,23 @@
                              offset_to_length, can_collect):
         size_gc_header = self.gcheaderbuilder.size_gc_header
         nonvarsize = size_gc_header + size
-        totalsize = self._get_totalsize_var(nonvarsize, itemize, length)
+        totalsize = self._get_totalsize_var(nonvarsize, itemsize, length)
         result = self._get_memory(totalsize)
         llmemory.raw_memclear(result, totalsize)
         (result + size_gc_header + offset_to_length).signed[0] = length
         return self._setup_object(result, typeid16, False, False)
 
     def obtain_free_space(self, requested_size):
-        self.markcompactcollect(requested_size)
+        while True:
+            executed_some_finalizers = self.markcompactcollect(requested_size)
+            self.next_collect_after -= requested_size
+            if self.next_collect_after >= 0:
+                break    # ok
+            else:
+                if executed_some_finalizers:
+                    pass   # try again to do a collection
+                else:
+                    raise MemoryError
     obtain_free_space._dont_inline_ = True
 
     def collect(self, gen=0):
@@ -234,12 +250,9 @@
         self.free = finaladdr
         remaining_size = (toaddr + self.space_size) - finaladdr
         llarena.arena_reset(finaladdr, remaining_size, False)
-
-        if requested_size > remaining_size:
-            raise MemoryError
-        self.next_collect_after = self.next_collection(
-            (finaladdr - toaddr) + requested_size,
-            self.num_alive_objs + 1)
+        self.next_collect_after = self.next_collection(finaladdr - toaddr,
+                                                       self.num_alive_objs,
+                                                       requested_size)
         #
         if not we_are_translated():
             llarena.arena_free(self.space)
@@ -249,16 +262,12 @@
         self.debug_collect_finish(start_time)
         if self.next_collect_after < 0:
             raise MemoryError
-        ll_assert((self.free - self.space) +   # used space
-                  requested_size +             # requested extra size
-                  BYTES_PER_TID * self.num_alive_objs +    # space for TIDs
-                  BYTES_PER_TID +              # space for extra TID
-                  self.next_collect_after      # size we can allocate later
-                  <= self.space_size,
-                  "miscomputation of next_collect_after")
         #
         if self.run_finalizers.non_empty():
             self.execute_finalizers()
+            return True      # executed some finalizers
+        else:
+            return False     # no finalizer executed
 
     def collect_weakref_offsets(self):
         weakrefs = self.objects_with_weakrefs

Modified: pypy/branch/markcompact/pypy/rpython/memory/gc/test/test_direct.py
==============================================================================
--- pypy/branch/markcompact/pypy/rpython/memory/gc/test/test_direct.py	(original)
+++ pypy/branch/markcompact/pypy/rpython/memory/gc/test/test_direct.py	Fri Aug 27 18:55:50 2010
@@ -437,3 +437,11 @@
     def test_many_objects(self):
         DirectGCTest.test_many_objects(self)
     test_many_objects.GC_PARAMS = {'space_size': 3 * 4096}
+
+    def test_varsized_from_stack(self):
+        DirectGCTest.test_varsized_from_stack(self)
+    test_varsized_from_stack.GC_PARAMS = {'space_size': 2 * 4096}
+
+    def test_varsized_from_prebuilt_gc(self):
+        DirectGCTest.test_varsized_from_prebuilt_gc(self)
+    test_varsized_from_prebuilt_gc.GC_PARAMS = {'space_size': 3 * 4096}



More information about the Pypy-commit mailing list