[pypy-commit] pypy stmgc-c4: add a flag to jitdriver to mark it as transaction-break friendly -> reintroduces atomicity of bytecode instructions

Raemi noreply at buildbot.pypy.org
Tue Jan 14 10:44:17 CET 2014


Author: Remi Meier <remi.meier at 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'
 


More information about the pypy-commit mailing list