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