[pypy-commit] pypy jit-counter: Add a hook to call the decay_all_counters() function after each

arigo noreply at buildbot.pypy.org
Thu Oct 31 13:43:54 CET 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: jit-counter
Changeset: r67778:10ff42dc1b73
Date: 2013-10-31 13:43 +0100
http://bitbucket.org/pypy/pypy/changeset/10ff42dc1b73/

Log:	Add a hook to call the decay_all_counters() function after each
	minor collection. Currently only implemented with incminimark.

diff --git a/rpython/jit/backend/llsupport/gc.py b/rpython/jit/backend/llsupport/gc.py
--- a/rpython/jit/backend/llsupport/gc.py
+++ b/rpython/jit/backend/llsupport/gc.py
@@ -369,7 +369,9 @@
         translator = self.translator
         self.layoutbuilder = framework.TransformerLayoutBuilder(translator)
         self.layoutbuilder.delay_encoding()
-        translator._jit2gc = {'layoutbuilder': self.layoutbuilder}
+        if not hasattr(translator, '_jit2gc'):
+            translator._jit2gc = {}
+        translator._jit2gc['layoutbuilder'] = self.layoutbuilder
 
     def _setup_gcclass(self):
         from rpython.memory.gcheader import GCHeaderBuilder
diff --git a/rpython/jit/metainterp/counter.py b/rpython/jit/metainterp/counter.py
--- a/rpython/jit/metainterp/counter.py
+++ b/rpython/jit/metainterp/counter.py
@@ -11,7 +11,7 @@
 class JitCounter:
     DEFAULT_SIZE = 4096
 
-    def __init__(self, size=DEFAULT_SIZE):
+    def __init__(self, size=DEFAULT_SIZE, translator=None):
         "NOT_RPYTHON"
         self.size = size
         self.shift = 1
@@ -23,6 +23,14 @@
                                        track_allocation=False)
         self.celltable = [None] * size
         self._nextindex = 0
+        #
+        if translator is not None:
+            def invoke_after_minor_collection():
+                self.decay_all_counters()
+            if not hasattr(translator, '_jit2gc'):
+                translator._jit2gc = {}
+            translator._jit2gc['invoke_after_minor_collection'] = (
+                invoke_after_minor_collection)
 
     def compute_threshold(self, threshold):
         """Return the 'increment' value corresponding to the given number."""
diff --git a/rpython/jit/metainterp/warmspot.py b/rpython/jit/metainterp/warmspot.py
--- a/rpython/jit/metainterp/warmspot.py
+++ b/rpython/jit/metainterp/warmspot.py
@@ -207,7 +207,7 @@
         #
         from rpython.jit.metainterp import counter
         if self.cpu.translate_support_code:
-            self.jitcounter = counter.JitCounter()
+            self.jitcounter = counter.JitCounter(translator=translator)
         else:
             self.jitcounter = counter.DeterministicJitCounter()
         #
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
@@ -1459,6 +1459,9 @@
                     self.get_total_memory_used())
         if self.DEBUG >= 2:
             self.debug_check_consistency()     # expensive!
+        #
+        self.root_walker.finished_minor_collection()
+        #
         debug_stop("gc-minor")
 
 
diff --git a/rpython/memory/gc/test/test_direct.py b/rpython/memory/gc/test/test_direct.py
--- a/rpython/memory/gc/test/test_direct.py
+++ b/rpython/memory/gc/test/test_direct.py
@@ -60,6 +60,9 @@
     def _walk_prebuilt_gc(self, callback):
         pass
 
+    def finished_minor_collection(self):
+        pass
+
 
 class BaseDirectGCTest(object):
     GC_PARAMS = {}
diff --git a/rpython/memory/gctransform/framework.py b/rpython/memory/gctransform/framework.py
--- a/rpython/memory/gctransform/framework.py
+++ b/rpython/memory/gctransform/framework.py
@@ -142,8 +142,11 @@
 
         if hasattr(translator, '_jit2gc'):
             self.layoutbuilder = translator._jit2gc['layoutbuilder']
+            finished_minor_collection = translator._jit2gc.get(
+                'finished_minor_collection', None)
         else:
             self.layoutbuilder = TransformerLayoutBuilder(translator, GCClass)
+            finished_minor_collection = None
         self.layoutbuilder.transformer = self
         self.get_type_id = self.layoutbuilder.get_type_id
 
@@ -167,6 +170,7 @@
 
         gcdata.gc = GCClass(translator.config.translation, **GC_PARAMS)
         root_walker = self.build_root_walker()
+        root_walker.finished_minor_collection_func = finished_minor_collection
         self.root_walker = root_walker
         gcdata.set_query_functions(gcdata.gc)
         gcdata.gc.set_root_walker(root_walker)
@@ -1285,6 +1289,7 @@
 
 class BaseRootWalker(object):
     thread_setup = None
+    finished_minor_collection_func = None
 
     def __init__(self, gctransformer):
         self.gcdata = gctransformer.gcdata
@@ -1322,6 +1327,11 @@
         if collect_stack_root:
             self.walk_stack_roots(collect_stack_root)     # abstract
 
+    def finished_minor_collection(self):
+        func = self.finished_minor_collection_func
+        if func is not None:
+            func()
+
     def need_stacklet_support(self):
         raise Exception("%s does not support stacklets" % (
             self.__class__.__name__,))
diff --git a/rpython/memory/gcwrapper.py b/rpython/memory/gcwrapper.py
--- a/rpython/memory/gcwrapper.py
+++ b/rpython/memory/gcwrapper.py
@@ -195,6 +195,9 @@
         for obj in self.gcheap._all_prebuilt_gc:
             collect(llmemory.cast_ptr_to_adr(obj._as_ptr()))
 
+    def finished_minor_collection(self):
+        pass
+
 
 class DirectRunLayoutBuilder(gctypelayout.TypeLayoutBuilder):
 
diff --git a/rpython/memory/test/test_transformed_gc.py b/rpython/memory/test/test_transformed_gc.py
--- a/rpython/memory/test/test_transformed_gc.py
+++ b/rpython/memory/test/test_transformed_gc.py
@@ -45,6 +45,8 @@
     taggedpointers = False
 
     def setup_class(cls):
+        cls.marker = lltype.malloc(rffi.CArray(lltype.Signed), 1,
+                                   flavor='raw', zero=True)
         funcs0 = []
         funcs2 = []
         cleanups = []
@@ -744,12 +746,18 @@
     def ensure_layoutbuilder(cls, translator):
         jit2gc = getattr(translator, '_jit2gc', None)
         if jit2gc:
+            assert 'finished_minor_collection' in jit2gc
             return jit2gc['layoutbuilder']
+        marker = cls.marker
         GCClass = cls.gcpolicy.transformerclass.GCClass
         layoutbuilder = framework.TransformerLayoutBuilder(translator, GCClass)
         layoutbuilder.delay_encoding()
+
+        def seeme():
+            marker[0] += 1
         translator._jit2gc = {
             'layoutbuilder': layoutbuilder,
+            'finished_minor_collection': seeme,
         }
         return layoutbuilder
 
@@ -768,6 +776,15 @@
                 g()
                 i += 1
             return 0
+
+        if cls.gcname == 'incminimark':
+            marker = cls.marker
+            def cleanup():
+                assert marker[0] > 0
+                marker[0] = 0
+        else:
+            cleanup = None
+
         def fix_graph_of_g(translator):
             from rpython.translator.translator import graphof
             from rpython.flowspace.model import Constant
@@ -788,7 +805,7 @@
                     break
             else:
                 assert 0, "oups, not found"
-        return f, None, fix_graph_of_g
+        return f, cleanup, fix_graph_of_g
 
     def test_do_malloc_operations(self):
         run = self.runner("do_malloc_operations")


More information about the pypy-commit mailing list