bpo-30814: Fixed a race condition when import a submodule from a pack… · python/cpython@b4baace (original) (raw)
`@@ -956,9 +956,19 @@ def find_and_load_unlocked(name, import):
`
956
956
``
957
957
``
958
958
`def find_and_load(name, import):
`
959
``
`-
"""Find and load the module, and release the import lock."""
`
960
``
`-
with _ModuleLockManager(name):
`
961
``
`-
return find_and_load_unlocked(name, import)
`
``
959
`+
"""Find and load the module."""
`
``
960
`+
_imp.acquire_lock()
`
``
961
`+
if name not in sys.modules:
`
``
962
`+
with _ModuleLockManager(name):
`
``
963
`+
return find_and_load_unlocked(name, import)
`
``
964
`+
module = sys.modules[name]
`
``
965
`+
if module is None:
`
``
966
`+
_imp.release_lock()
`
``
967
`+
message = ('import of {} halted; '
`
``
968
`+
'None in sys.modules'.format(name))
`
``
969
`+
raise ModuleNotFoundError(message, name=name)
`
``
970
`+
_lock_unlock_module(name)
`
``
971
`+
return module
`
962
972
``
963
973
``
964
974
`def _gcd_import(name, package=None, level=0):
`
`@@ -973,17 +983,7 @@ def _gcd_import(name, package=None, level=0):
`
973
983
`_sanity_check(name, package, level)
`
974
984
`if level > 0:
`
975
985
`name = _resolve_name(name, package, level)
`
976
``
`-
_imp.acquire_lock()
`
977
``
`-
if name not in sys.modules:
`
978
``
`-
return _find_and_load(name, _gcd_import)
`
979
``
`-
module = sys.modules[name]
`
980
``
`-
if module is None:
`
981
``
`-
_imp.release_lock()
`
982
``
`-
message = ('import of {} halted; '
`
983
``
`-
'None in sys.modules'.format(name))
`
984
``
`-
raise ModuleNotFoundError(message, name=name)
`
985
``
`-
_lock_unlock_module(name)
`
986
``
`-
return module
`
``
986
`+
return _find_and_load(name, _gcd_import)
`
987
987
``
988
988
``
989
989
`def handle_fromlist(module, fromlist, import):
`