[pypy-commit] pypy gc-incminimark-pinning-improve: added comments to collect_and_reserve

groggi noreply at buildbot.pypy.org
Mon Mar 23 14:28:59 CET 2015


Author: Gregor Wegberg <code at gregorwegberg.com>
Branch: gc-incminimark-pinning-improve
Changeset: r76519:1fdd47a9602c
Date: 2014-12-11 20:43 +0100
http://bitbucket.org/pypy/pypy/changeset/1fdd47a9602c/

Log:	added comments to collect_and_reserve

diff --git a/rpython/memory/gc/incminimark.py b/rpython/memory/gc/incminimark.py
--- a/rpython/memory/gc/incminimark.py
+++ b/rpython/memory/gc/incminimark.py
@@ -682,7 +682,7 @@
     def collect_and_reserve(self, totalsize):
         """To call when nursery_free overflows nursery_top.
         First check if the nursery_top is the real top, otherwise we
-        can just move the top of one cleanup and continue
+        can just move the top of one cleanup and continue.
 
         Do a minor collection, and possibly also a major collection,
         and finally reserve 'totalsize' bytes at the start of the
@@ -694,10 +694,22 @@
             self.nursery_free = llmemory.NULL      # debug: don't use me
 
             if self.nursery_barriers.non_empty():
+                # Pinned object in front of nursery_top. Try by jumping into the
+                # next area inside the nursery. 'Next area' is in this case the
+                # pinned object after the next pinned one and the one after the
+                # next or the end of the nursery. Graphically explained:
+                # 
+                #     |- allocating totalsize failed in this are
+                #     v          v- next pinned object, jump over
+                # +---------+--------+--------+--------+-----------+
+                # | unknown | pinned | empty  | pinned |  empty    | <- nursery
+                # +---------+--------+--------+--------+-----------+
+                #                      ^- try allocating totalsize in here next
+                #
                 size_gc_header = self.gcheaderbuilder.size_gc_header
                 pinned_obj_size = size_gc_header + self.get_size(
                         self.nursery_top + size_gc_header)
-
+                #
                 self.nursery_free = self.nursery_top + pinned_obj_size
                 self.nursery_top = self.nursery_barriers.popleft()
             else:
@@ -725,6 +737,8 @@
                             "Seeing minor_collection() at least twice."
                             "Too many pinned objects?")
             #
+            # GC tried to do something about nursery_free overflowing
+            # nursery_top before this point. Try to allocate totalsize now.
             result = self.nursery_free
             if self.nursery_free + totalsize <= self.nursery_top:
                 self.nursery_free = result + totalsize


More information about the pypy-commit mailing list