Author: Armin Rigo <[email protected]>
Branch: stmgc-c7
Changeset: r75609:e764f42b5dcb
Date: 2015-01-31 15:12 +0100
http://bitbucket.org/pypy/pypy/changeset/e764f42b5dcb/

Log:    tweak tweak tweak to make this list thread-local

diff --git a/rpython/rtyper/annlowlevel.py b/rpython/rtyper/annlowlevel.py
--- a/rpython/rtyper/annlowlevel.py
+++ b/rpython/rtyper/annlowlevel.py
@@ -252,7 +252,7 @@
         original_graph_count = len(translator.graphs)
         perform_normalizations(rtyper.annotator)
         for r in self.delayedreprs:
-            r.set_setup_delayed(False)
+            r.set_setup_delayed(False, rtyper)
         rtyper.call_all_setups()
         for p, repr, obj in self.delayedconsts:
             p._become(repr.convert_const(obj))
diff --git a/rpython/rtyper/rmodel.py b/rpython/rtyper/rmodel.py
--- a/rpython/rtyper/rmodel.py
+++ b/rpython/rtyper/rmodel.py
@@ -79,12 +79,14 @@
     def is_setup_delayed(self):
         return self._initialized == setupstate.DELAYED
 
-    def set_setup_delayed(self, flag):
+    def set_setup_delayed(self, flag, rtyper=None):
         assert self._initialized in (setupstate.NOTINITIALIZED,
                                      setupstate.DELAYED)
         if flag:
             self._initialized = setupstate.DELAYED
         else:
+            if self._initialized == setupstate.DELAYED:
+                rtyper._list_must_call_setup().append(self)
             self._initialized = setupstate.NOTINITIALIZED
 
     def set_setup_maybe_delayed(self):
diff --git a/rpython/rtyper/rtyper.py b/rpython/rtyper/rtyper.py
--- a/rpython/rtyper/rtyper.py
+++ b/rpython/rtyper/rtyper.py
@@ -32,6 +32,11 @@
 from rpython.tool.pairtype import pair
 from rpython.translator.unsimplify import insert_empty_block
 
+try:
+    from pypystm import stmset, stmdict
+except ImportError:
+    stmset, stmdict = set, dict
+
 
 class RPythonTyper(object):
     from rpython.rtyper.rmodel import log
@@ -40,9 +45,9 @@
         self.annotator = annotator
         self.lowlevel_ann_policy = LowLevelAnnotatorPolicy(self)
         self.type_system = LowLevelTypeSystem()
-        self.reprs = {}
-        self._reprs_must_call_setup = []
-        self._seen_reprs_must_call_setup = {}
+        self.reprs = stmdict()
+        self._seen_reprs_must_call_setup = stmset()
+        self._all_lists_must_call_setup = []
         self._dict_traits = {}
         self.rootclass_repr = RootClassRepr(self)
         self.rootclass_repr.setup()
@@ -98,8 +103,16 @@
         if repr in self._seen_reprs_must_call_setup:
             #warning("ignoring already seen repr for setup: %r" %(repr,))
             return
-        self._reprs_must_call_setup.append(repr)
-        self._seen_reprs_must_call_setup[repr] = True
+        self._list_must_call_setup().append(repr)
+        self._seen_reprs_must_call_setup.add(repr)
+
+    def _list_must_call_setup(self):
+        try:
+            lst = annmodel.TLS._reprs_must_call_setup
+        except AttributeError:
+            lst = annmodel.TLS._reprs_must_call_setup = []
+            self._all_lists_must_call_setup.append(lst)
+        return lst
 
     def lltype_to_classdef_mapping(self):
         result = {}
@@ -216,6 +229,8 @@
             else:
                 tracking = lambda block: None
 
+            self.call_all_setups(all_threads=True)
+
             try:
               import transaction
             except ImportError:
@@ -251,7 +266,7 @@
                 self.already_seen.update(dict.fromkeys(pending, True))
 
             # make sure all reprs so far have had their setup() called
-            self.call_all_setups()
+            self.call_all_setups(all_threads=True)
 
         if self.typererrors:
             self.dump_typererrors(to_log=True)
@@ -286,20 +301,23 @@
             else:
                 print minmsg
 
-    def call_all_setups(self):
+    def call_all_setups(self, all_threads=False):
         # make sure all reprs so far have had their setup() called
         must_setup_more = []
-        delayed = []
-        while self._reprs_must_call_setup:
-            r = self._reprs_must_call_setup.pop()
-            if r.is_setup_delayed():
-                delayed.append(r)
-            else:
-                r.setup()
-                must_setup_more.append(r)
+        if all_threads:
+            lsts = self._all_lists_must_call_setup
+        else:
+            lsts = [self._list_must_call_setup()]
+        for lst in lsts:
+            while lst:
+                r = lst.pop()
+                if r.is_setup_delayed():
+                    pass    # will be re-added in set_setup_delayed(False)
+                else:
+                    r.setup()
+                    must_setup_more.append(r)
         for r in must_setup_more:
             r.setup_final()
-        self._reprs_must_call_setup.extend(delayed)
 
     def setconcretetype(self, v):
         assert isinstance(v, Variable)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to