[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