[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