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

`