mirror of
https://github.com/python/cpython.git
synced 2025-10-06 15:11:58 +00:00
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 e72b1359f8
)
This commit is contained in:
parent
df5837b5a9
commit
bb323b261d
2 changed files with 347 additions and 346 deletions
|
@ -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))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue