Kaydet (Commit) e72b1359 authored tarafından Victor Stinner's avatar Victor Stinner Kaydeden (comit) GitHub

bpo-30891: Fix again importlib _find_and_load() (#2665)

Use sys.modules.get() in the "with _ModuleLockManager(name):" block
to protect the dictionary key with the module lock and use an atomic
get to prevent race condition.

Remove also _bootstrap._POPULATE since it was unused
(_bootstrap_external now has its own _POPULATE object), add a new
_SENTINEL object instead.
üst 3913bad4
......@@ -446,9 +446,6 @@ def spec_from_loader(name, loader, *, origin=None, is_package=None):
return ModuleSpec(name, loader, origin=origin, is_package=is_package)
_POPULATE = object()
def _spec_from_module(module, loader=None, origin=None):
# This function is meant for use in _setup().
try:
......@@ -953,13 +950,16 @@ def _find_and_load_unlocked(name, import_):
return module
_NEEDS_LOADING = object()
def _find_and_load(name, import_):
"""Find and load the module."""
with _ModuleLockManager(name):
if name not in sys.modules:
module = sys.modules.get(name, _NEEDS_LOADING)
if module is _NEEDS_LOADING:
return _find_and_load_unlocked(name, import_)
module = sys.modules[name]
if module is None:
message = ('import of {} halted; '
'None in sys.modules'.format(name))
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment