Detach managers on pickling environment

This commit is contained in:
Takeshi KOMIYA 2016-10-11 18:09:36 +09:00
parent 97870ebc0b
commit 1f2368047e
3 changed files with 29 additions and 4 deletions

View File

@ -293,6 +293,7 @@ class Sphinx(object):
self.env = BuildEnvironment.frompickle(
self.srcdir, self.config, path.join(self.doctreedir, ENV_PICKLE_FILENAME))
self.env.set_warnfunc(self.warn)
self.env.init_managers()
self.env.domains = {}
for domain in self.domains.keys():
# this can raise if the data version doesn't fit

View File

@ -111,6 +111,7 @@ class BuildEnvironment(object):
del self.config.values
domains = self.domains
del self.domains
managers = self.detach_managers()
# remove potentially pickling-problematic values from config
for key, val in list(vars(self.config).items()):
if key.startswith('_') or \
@ -121,6 +122,7 @@ class BuildEnvironment(object):
with open(filename, 'wb') as picklefile:
pickle.dump(self, picklefile, pickle.HIGHEST_PROTOCOL)
# reset attributes
self.attach_managers(managers)
self.domains = domains
self.config.values = values
self.set_warnfunc(warnfunc)
@ -205,14 +207,26 @@ class BuildEnvironment(object):
# attributes of "any" cross references
self.ref_context = {}
self.managers = {}
self.init_managers()
def init_managers(self):
self.managers = {}
managers = {}
for manager_class in [IndexEntries, Toctree]:
manager = manager_class(self)
self.managers[manager.name] = manager
setattr(self, manager.name, manager)
managers[manager_class.name] = manager_class(self)
self.attach_managers(managers)
def attach_managers(self, managers):
for name, manager in iteritems(managers):
self.managers[name] = manager
manager.attach(self)
def detach_managers(self):
managers = self.managers
self.managers = {}
for _, manager in iteritems(managers):
manager.detach(self)
return managers
def set_warnfunc(self, func):
self._warnfunc = func

View File

@ -17,6 +17,16 @@ class EnvironmentManager(object):
def __init__(self, env):
self.env = env
def attach(self, env):
self.env = env
if self.name:
setattr(env, self.name, self)
def detach(self, env):
self.env = None
if self.name:
delattr(env, self.name)
def clear_doc(self, docname):
raise NotImplementedError