bpo-30814: Fixed a race condition when import a submodule from a pack… · python/cpython@b4baace
@@ -956,9 +956,19 @@ def _find_and_load_unlocked(name, import_):
956956957957958958def _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
962972963973964974def _gcd_import(name, package=None, level=0):
@@ -973,17 +983,7 @@ def _gcd_import(name, package=None, level=0):
973983_sanity_check(name, package, level)
974984if level > 0:
975985name = _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)
987987988988989989def _handle_fromlist(module, fromlist, import_):