[pypy-commit] pypy stmgc-c7: Insert the stm_read() barriers at the correct time
arigo
noreply at buildbot.pypy.org
Tue Mar 11 18:11:16 CET 2014
Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c7
Changeset: r69869:de414b61f2d7
Date: 2014-03-11 18:10 +0100
http://bitbucket.org/pypy/pypy/changeset/de414b61f2d7/
Log: Insert the stm_read() barriers at the correct time
diff --git a/rpython/rtyper/lltypesystem/lloperation.py b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -413,6 +413,7 @@
# must be no gc-var access afterwards anyway)
'stm_register_thread_local': LLOp(),
'stm_unregister_thread_local': LLOp(),
+ 'stm_read': LLOp(),
'stm_write': LLOp(),
'stm_can_move': LLOp(),
'stm_allocate_tid': LLOp(sideeffects=False, canmallocgc=True),
diff --git a/rpython/translator/c/genc.py b/rpython/translator/c/genc.py
--- a/rpython/translator/c/genc.py
+++ b/rpython/translator/c/genc.py
@@ -160,9 +160,6 @@
sandbox=self.config.translation.sandbox)
self.db = db
- if self.config.translation.stm:
- stmtransformer.transform_after_gc()
-
# give the gc a chance to register interest in the start-up functions it
# need (we call this for its side-effects of db.get())
list(db.gcpolicy.gc_startup_code())
@@ -187,6 +184,9 @@
exports.clear()
db.complete()
+ if self.config.translation.stm:
+ stmtransformer.transform_after_gc()
+
self.collect_compilation_info(db)
return db
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
@@ -52,6 +52,12 @@
def stm_unregister_thread_local(funcgen, op):
return 'stm_unregister_thread_local(&stm_thread_local);'
+def stm_read(funcgen, op):
+ assert isinstance(op.args[0].concretetype, lltype.Ptr)
+ assert op.args[0].concretetype.TO._gckind == 'gc'
+ arg0 = funcgen.expr(op.args[0])
+ return 'stm_read((object_t *)%s);' % (arg0,)
+
def stm_write(funcgen, op):
assert isinstance(op.args[0].concretetype, lltype.Ptr)
assert op.args[0].concretetype.TO._gckind == 'gc'
diff --git a/rpython/translator/stm/readbarrier.py b/rpython/translator/stm/readbarrier.py
--- a/rpython/translator/stm/readbarrier.py
+++ b/rpython/translator/stm/readbarrier.py
@@ -27,5 +27,6 @@
if op.opname in READ_OPS and is_gc_ptr(op.args[0].concretetype):
v_none = varoftype(lltype.Void)
newops.append(SpaceOperation('stm_read', [op.args[0]], v_none))
+ transformer.read_barrier_counts += 1
newops.append(op)
block.operations = newops
diff --git a/rpython/translator/stm/transform.py b/rpython/translator/stm/transform.py
--- a/rpython/translator/stm/transform.py
+++ b/rpython/translator/stm/transform.py
@@ -12,22 +12,23 @@
def transform(self):
assert not hasattr(self.translator, 'stm_transformation_applied')
- self.start_log()
+ self.start_log(1)
self.transform_jit_driver()
- self.transform_read_barrier()
self.transform_turn_inevitable()
- self.print_logs()
+ self.print_logs(1)
self.translator.stm_transformation_applied = True
def transform_after_gc(self):
+ self.start_log(2)
self.transform_threadlocalref()
- self.print_logs_after_gc()
+ self.transform_read_barrier()
+ self.print_logs(2)
def transform_read_barrier(self):
self.read_barrier_counts = 0
for graph in self.translator.graphs:
insert_stm_read_barrier(self, graph)
- log("%d read barriers inserted" % (self.read_barrier_counts,))
+ log.info("%d read barriers inserted" % (self.read_barrier_counts,))
def transform_turn_inevitable(self):
for graph in self.translator.graphs:
@@ -38,13 +39,13 @@
reorganize_around_jit_driver(self, graph)
def transform_threadlocalref(self):
+ return #XXX XXX XXX
transform_tlref(self.translator)
- def start_log(self):
- log.info("Software Transactional Memory transformation")
+ def start_log(self, step):
+ log.info("Software Transactional Memory transformation, step %d"
+ % step)
- def print_logs(self):
- log.info("Software Transactional Memory transformation applied")
-
- def print_logs_after_gc(self):
- log.info("Software Transactional Memory transformation-after-gc done")
+ def print_logs(self, step):
+ log.info("Software Transactional Memory transformation, step %d, "
+ "applied" % step)
More information about the pypy-commit
mailing list