Author: Remi Meier <remi.me...@gmail.com> Branch: stmgc-c4 Changeset: r68659:e21f53a50e0d Date: 2014-01-14 10:17 +0100 http://bitbucket.org/pypy/pypy/changeset/e21f53a50e0d/
Log: add a flag to jitdriver to mark it as transaction-break friendly -> reintroduces atomicity of bytecode instructions diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py --- a/pypy/interpreter/pyopcode.py +++ b/pypy/interpreter/pyopcode.py @@ -42,7 +42,8 @@ stmonly_jitdriver = jit.JitDriver(greens=[], reds=['next_instr', 'ec', - 'self', 'co_code']) + 'self', 'co_code'], + stm_do_transaction_breaks=True) opcodedesc = bytecode_spec.opcodedesc HAVE_ARGUMENT = bytecode_spec.HAVE_ARGUMENT diff --git a/pypy/module/pypyjit/interp_jit.py b/pypy/module/pypyjit/interp_jit.py --- a/pypy/module/pypyjit/interp_jit.py +++ b/pypy/module/pypyjit/interp_jit.py @@ -56,7 +56,8 @@ set_jitcell_at = set_jitcell_at, should_unroll_one_iteration = should_unroll_one_iteration, - name='pypyjit') + name='pypyjit', + stm_do_transaction_breaks=True) class __extend__(PyFrame): diff --git a/rpython/jit/tl/tlc.py b/rpython/jit/tl/tlc.py --- a/rpython/jit/tl/tlc.py +++ b/rpython/jit/tl/tlc.py @@ -229,7 +229,8 @@ def make_interp(supports_call, jitted=True): myjitdriver = JitDriver(greens = ['pc', 'code'], - reds = ['frame', 'pool']) + reds = ['frame', 'pool'], + stm_do_transaction_breaks=True) def interp(code='', pc=0, inputarg=0, pool=None): if not isinstance(code,str): diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py --- a/rpython/rlib/jit.py +++ b/rpython/rlib/jit.py @@ -479,12 +479,14 @@ name = 'jitdriver' inline_jit_merge_point = False _store_last_enter_jit = None + stm_do_transaction_breaks = False def __init__(self, greens=None, reds=None, virtualizables=None, get_jitcell_at=None, set_jitcell_at=None, get_printable_location=None, confirm_enter_jit=None, can_never_inline=None, should_unroll_one_iteration=None, - name='jitdriver', check_untranslated=True): + name='jitdriver', check_untranslated=True, + stm_do_transaction_breaks=False): if greens is not None: self.greens = greens self.name = name @@ -520,6 +522,7 @@ self.can_never_inline = can_never_inline self.should_unroll_one_iteration = should_unroll_one_iteration self.check_untranslated = check_untranslated + self.stm_do_transaction_breaks = stm_do_transaction_breaks def _freeze_(self): return True diff --git a/rpython/translator/stm/jitdriver.py b/rpython/translator/stm/jitdriver.py --- a/rpython/translator/stm/jitdriver.py +++ b/rpython/translator/stm/jitdriver.py @@ -18,13 +18,11 @@ and op.args[0].value == 'jit_merge_point'): jitdriver = op.args[1].value if not jitdriver.autoreds: - # XXX: BUG, redo the below code in order to ensure atomicity of bytecode instrs - # if (relaxed - # or (i + 1 < len(block.operations) - # and block.operations[i+1].opname == 'jit_stm_transaction_break_point')): - found.append((block, i)) - # else: - # log.WARNING("ignoring jitdriver without a transaction break point in %r" % (graph,)) + if jitdriver.stm_do_transaction_breaks: + found.append((block, i)) + else: + log.WARNING("ignoring non-stm jitdriver in %r" % ( + graph,)) else: log.WARNING("ignoring jitdriver with autoreds in %r" % ( graph,)) # XXX XXX! diff --git a/rpython/translator/stm/test/test_jitdriver.py b/rpython/translator/stm/test/test_jitdriver.py --- a/rpython/translator/stm/test/test_jitdriver.py +++ b/rpython/translator/stm/test/test_jitdriver.py @@ -1,6 +1,7 @@ from rpython.rtyper.lltypesystem import lltype, rffi from rpython.translator.stm.test.transform_support import BaseTestTransform from rpython.rlib.jit import JitDriver +from rpython.rlib import rstm class TestJitDriver(BaseTestTransform): @@ -10,11 +11,14 @@ class X: counter = 10 x = X() - myjitdriver = JitDriver(greens=[], reds=[]) + myjitdriver = JitDriver(greens=[], reds=[], + stm_do_transaction_breaks=True) def f1(): while x.counter > 0: myjitdriver.jit_merge_point() + if rstm.jit_stm_should_break_transaction(False): + rstm.jit_stm_transaction_break_point() x.counter -= 1 return 'X' _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit