Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.
(cherry picked from commit e72b135)
  • Loading branch information
vstinner committed Jul 21, 2017
commit d751fdcf0606ce424aec02f5c22dfa04556c4be5
10 changes: 5 additions & 5 deletions Lib/importlib/_bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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))
Expand Down
Loading