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_):

956956957957958958

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

962972963973964974

def _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)

974984

if level > 0:

975985

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)

987987988988989989

def _handle_fromlist(module, fromlist, import_):