[pypy-commit] pypy stmgc-c4: still in-progress

arigo noreply at buildbot.pypy.org
Sat Jun 29 20:04:15 CEST 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c4
Changeset: r65102:e41f1d5ce8a2
Date: 2013-06-29 20:03 +0200
http://bitbucket.org/pypy/pypy/changeset/e41f1d5ce8a2/

Log:	still in-progress

diff --git a/rpython/translator/stm/funcgen.py b/rpython/translator/stm/funcgen.py
--- a/rpython/translator/stm/funcgen.py
+++ b/rpython/translator/stm/funcgen.py
@@ -37,13 +37,22 @@
     assert funcgen.db.translator.config.translation.gc == 'none'
     return 'stm_nogc_stop_transaction();'
 
+_STM_BARRIER_FUNCS = {   # XXX try to see if some combinations can be shorter
+    'P2R': 'stm_read_barrier',
+    'G2R': 'stm_read_barrier',
+    'O2R': 'stm_read_barrier',
+    'P2W': 'stm_write_barrier',
+    'G2W': 'stm_write_barrier',
+    'O2W': 'stm_write_barrier',
+    'R2W': 'stm_write_barrier',
+    }
+
 def stm_barrier(funcgen, op):
-    xxx
     category_change = op.args[0].value
-    assert type(category_change) is str and len(category_change) == 3   # "x2y"
+    funcname = _STM_BARRIER_FUNCS[category_change]
     arg = funcgen.expr(op.args[1])
     result = funcgen.expr(op.result)
-    return '%s = stm_barrier_%s(%s);' % (result, category_change, arg)
+    return '%s = %s(%s);' % (result, funcname, arg)
 
 def stm_ptr_eq(funcgen, op):
     xxx
@@ -53,7 +62,6 @@
     return '%s = stm_pointer_equal(%s, %s);' % (result, arg0, arg1)
 
 def stm_become_inevitable(funcgen, op):
-    xxx
     try:
         info = op.args[0].value
     except IndexError:
diff --git a/rpython/translator/stm/inevitable.py b/rpython/translator/stm/inevitable.py
--- a/rpython/translator/stm/inevitable.py
+++ b/rpython/translator/stm/inevitable.py
@@ -84,7 +84,12 @@
         funcptr = get_funcobj(op.args[0].value)
         if not hasattr(funcptr, "external"):
             return False
-        return not getattr(funcptr, "transactionsafe", False)
+        if getattr(funcptr, "transactionsafe", False):
+            return False
+        try:
+            return funcptr._name + '()'
+        except AttributeError:
+            return True
 
     if op.opname == 'indirect_call':
         tographs = op.args[-1].value
@@ -118,6 +123,9 @@
     for block in graph.iterblocks():
         for i in range(len(block.operations)-1, -1, -1):
             op = block.operations[i]
-            if should_turn_inevitable(op, block, fresh_mallocs):
-                inev_op = turn_inevitable_op(op.opname)
+            inev = should_turn_inevitable(op, block, fresh_mallocs)
+            if inev:
+                if not isinstance(inev, str):
+                    inev = op.opname
+                inev_op = turn_inevitable_op(inev)
                 block.operations.insert(i, inev_op)


More information about the pypy-commit mailing list