Author: Remi Meier <remi.me...@inf.ethz.ch>
Branch: stmgc-c8-gcc
Changeset: r79178:b9bb7b46ca8e
Date: 2015-08-24 10:20 +0200
http://bitbucket.org/pypy/pypy/changeset/b9bb7b46ca8e/

Log:    hack to re-add blackhole interp caching

        Currently leaks the interps of dead threads (needs fix). It improves
        the performance of 'pixie' annotation > rpython --thread --no-
        shared --gcrootfinder=shadowstack --continuation -O2 --annotate
        target.py from ~63s down to ~42s (pypy2.6 ~29s).

diff --git a/rpython/jit/metainterp/blackhole.py 
b/rpython/jit/metainterp/blackhole.py
--- a/rpython/jit/metainterp/blackhole.py
+++ b/rpython/jit/metainterp/blackhole.py
@@ -39,6 +39,40 @@
 
 # ____________________________________________________________
 
+from rpython.rlib import rthread#, rstm
+# from rpython.rtyper.annlowlevel import cast_gcref_to_instance
+# from rpython.rtyper.annlowlevel import cast_instance_to_gcref
+
+class BlackholeInterpreterCache(object):
+    # XXX: How to free bhis from dead threads?
+    #      A callback from rthread.gc_thread_die?
+    #      stm_hashtable to avoid conflicts when starting many threads?
+
+    def __init__(self):
+        assert rgc.stm_is_enabled()
+        self.stm_blackholeinterps = {}
+
+    def get_or_create(self, builder):
+        assert rgc.stm_is_enabled()
+        # conflicts with new threads calling put_back
+
+        ident = rthread.get_ident()
+        interps = self.stm_blackholeinterps.get(ident, None)
+        if interps is not None and len(interps) > 0:
+            return interps.pop()
+        return BlackholeInterpreter(builder, 0)
+
+    def put_back(self, interp):
+        assert rgc.stm_is_enabled()
+
+        ident = rthread.get_ident()
+        interps = self.stm_blackholeinterps.get(ident, None)
+        if interps is None:
+            interps = self.stm_blackholeinterps.setdefault(ident, [])
+
+        interp.cleanup_registers()
+        interps.append(interp)
+
 
 class BlackholeInterpBuilder(object):
     verbose = True
@@ -51,6 +85,7 @@
         self.metainterp_sd = metainterp_sd
         self.num_interpreters = 0
         self.blackholeinterps = []
+        self.stm_cache = None
 
     def _cleanup_(self):
         # XXX don't assign a different list to blackholeinterp here,
@@ -233,19 +268,25 @@
         return handler
 
     def acquire_interp(self):
-        if rgc.stm_is_enabled():   # XXX for now, no caching
-            return BlackholeInterpreter(self, 0)
-        if len(self.blackholeinterps) > 0:
-            return self.blackholeinterps.pop()
+        if rgc.stm_is_enabled():
+            if self.stm_cache is None:
+                self.stm_cache = BlackholeInterpreterCache()
+            return self.stm_cache.get_or_create(self)
         else:
-            self.num_interpreters += 1
-            return BlackholeInterpreter(self, self.num_interpreters)
+            # no STM:
+            if len(self.blackholeinterps) > 0:
+                return self.blackholeinterps.pop()
+            else:
+                self.num_interpreters += 1
+                return BlackholeInterpreter(self, self.num_interpreters)
 
     def release_interp(self, interp):
         if rgc.stm_is_enabled():   # XXX for now, no caching
-            return
-        interp.cleanup_registers()
-        self.blackholeinterps.append(interp)
+            self.stm_cache.put_back(interp)
+        else:
+            # no STM:
+            interp.cleanup_registers()
+            self.blackholeinterps.append(interp)
 
 def check_shift_count(b):
     if not we_are_translated():
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to