[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