diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -191,6 +191,97 @@ def _new_module(name): return type(sys)(name) +# Module-level locking ######################################################## + +_module_locks = {} +_blocking_on = {} + +class _ModuleLock: + + def __init__(self, name): + self.lock = _thread.allocate_lock() + self.wakeup = _thread.allocate_lock() + self.name = name + self.owner = None + self.count = 0 + self.waiters = 0 + + def has_deadlock(self): + # Deadlock avoidance for concurrent circular imports. + me = _thread.get_ident() + tid = self.owner + while True: + lock = _blocking_on.get(tid) + if lock is None: + return False + tid = lock.owner + if tid == me: + return True + + def acquire(self, avoid_deadlocks=False): + tid = _thread.get_ident() + _blocking_on[tid] = self + try: + while True: + with self.lock: + if self.count == 0 or self.owner == tid: + self.owner = tid + self.count += 1 + return True + if avoid_deadlocks and self.has_deadlock(): + return False + if self.wakeup.acquire(False): + self.waiters += 1 + self.wakeup.acquire() + self.wakeup.release() + finally: + del _blocking_on[tid] + + def release(self): + tid = _thread.get_ident() + with self.lock: + assert self.owner == tid + assert self.count > 0 + self.count -= 1 + if self.count == 0: + self.owner = None + if self.waiters: + self.waiters -= 1 + self.wakeup.release() + + def __repr__(self): + return "_ModuleLock(%r) at %d" % (self.name, id(self)) + + +def _get_module_lock(name): + # Should only be called with the import lock taken. + lock = None + if name in _module_locks: + lock = _module_locks[name]() + if lock is None: + lock = _ModuleLock(name) + def cb(_): + del _module_locks[name] + _module_locks[name] = _weakref.ref(lock, cb) + return lock + +def _get_module_lock(name): + # Should only be called with the import lock taken. + if name in _module_locks: + lock = _module_locks[name] + else: + lock = _ModuleLock(name) + _module_locks[name] = lock + return lock + +def _lock_unlock_module(name): + # Should only be called with the import lock taken. Releases it. + lock = _get_module_lock(name) + _imp.release_lock() + if lock.acquire(avoid_deadlocks=True): + lock.release() + + # Finder/loader utility code ################################################## PYCACHE = '__pycache__' @@ -290,12 +381,15 @@ def module_for_loader(fxn): else: module.__package__ = fullname.rpartition('.')[0] try: + module.__initializing__ = True # If __package__ was not set above, __import__() will do it later. return fxn(self, module, *args, **kwargs) except: if not is_reload: del sys.modules[fullname] raise + finally: + del module.__initializing__ _wrap(module_for_loader_wrapper, fxn) return module_for_loader_wrapper @@ -960,7 +1054,8 @@ def _find_module(name, path): if not sys.meta_path: _warnings.warn('sys.meta_path is empty', ImportWarning) for finder in sys.meta_path: - loader = finder.find_module(name, path) + with _ImportLockContext(): + loader = finder.find_module(name, path) if loader is not None: # The parent import may have already imported this module. if name not in sys.modules: @@ -990,8 +1085,7 @@ def _sanity_check(name, package, level): _ERR_MSG = 'No module named {!r}' -def _find_and_load(name, import_): - """Find and load the module.""" +def _find_and_load_unlocked(name, import_): path = None parent = name.rpartition('.')[0] if parent: @@ -1037,6 +1131,19 @@ def _find_and_load(name, import_): return module +def _find_and_load(name, import_): + """Find and load the module, and release the import lock.""" + try: + lock = _get_module_lock(name) + finally: + _imp.release_lock() + lock.acquire() + try: + return _find_and_load_unlocked(name, import_) + finally: + lock.release() + + def _gcd_import(name, package=None, level=0): """Import and return the module based on its name, the package the call is being made from, and the level adjustment. @@ -1049,17 +1156,17 @@ def _gcd_import(name, package=None, leve _sanity_check(name, package, level) if level > 0: name = _resolve_name(name, package, level) - with _ImportLockContext(): - try: - module = sys.modules[name] - if module is None: - message = ("import of {} halted; " - "None in sys.modules".format(name)) - raise ImportError(message, name=name) - return module - except KeyError: - pass # Don't want to chain the exception + _imp.acquire_lock() + if name not in sys.modules: return _find_and_load(name, _gcd_import) + module = sys.modules[name] + if module is None: + _imp.release_lock() + message = ("import of {} halted; " + "None in sys.modules".format(name)) + raise ImportError(message, name=name) + _lock_unlock_module(name) + return module def _handle_fromlist(module, fromlist, import_): @@ -1177,7 +1284,17 @@ def _setup(sys_module, _imp_module): continue else: raise ImportError('importlib requires posix or nt') + + try: + thread_module = BuiltinImporter.load_module('_thread') + except ImportError: + # Python was built without threads + thread_module = None + weakref_module = BuiltinImporter.load_module('_weakref') + setattr(self_module, '_os', os_module) + setattr(self_module, '_thread', thread_module) + setattr(self_module, '_weakref', weakref_module) setattr(self_module, 'path_sep', path_sep) setattr(self_module, 'path_separators', set(path_separators)) # Constants diff --git a/Lib/test/test_threaded_import.py b/Lib/test/test_threaded_import.py --- a/Lib/test/test_threaded_import.py +++ b/Lib/test/test_threaded_import.py @@ -12,7 +12,7 @@ import time import shutil import unittest from test.support import ( - verbose, import_module, run_unittest, TESTFN, reap_threads) + verbose, import_module, run_unittest, TESTFN, reap_threads, forget) threading = import_module('threading') def task(N, done, done_tasks, errors): @@ -187,7 +187,7 @@ class ThreadedImportTests(unittest.TestC contents = contents % {'delay': delay} with open(os.path.join(TESTFN, name + ".py"), "wb") as f: f.write(contents.encode('utf-8')) - self.addCleanup(sys.modules.pop, name, None) + self.addCleanup(forget, name) results = [] def import_ab(): @@ -204,6 +204,21 @@ class ThreadedImportTests(unittest.TestC t2.join() self.assertEqual(set(results), {'a', 'b'}) + def test_side_effect_import(self): + code = """if 1: + import threading + def target(): + import random + t = threading.Thread(target=target) + t.start() + t.join()""" + sys.path.insert(0, os.curdir) + self.addCleanup(sys.path.remove, os.curdir) + with open(TESTFN + ".py", "wb") as f: + f.write(code.encode('utf-8')) + self.addCleanup(forget, TESTFN) + __import__(TESTFN) + @reap_threads def test_main(): diff --git a/Lib/token.py b/Lib/token.py --- a/Lib/token.py +++ b/Lib/token.py @@ -70,7 +70,7 @@ NT_OFFSET = 256 tok_name = {value: name for name, value in globals().items() - if isinstance(value, int)} + if isinstance(value, int) and not name.startswith('_')} __all__.extend(tok_name.values()) def ISTERMINAL(x): diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -1488,11 +1488,13 @@ PyImport_ImportModuleLevelObject(PyObjec int level) { _Py_IDENTIFIER(__import__); + _Py_IDENTIFIER(__initializing__); _Py_IDENTIFIER(__package__); _Py_IDENTIFIER(__path__); _Py_IDENTIFIER(__name__); _Py_IDENTIFIER(_find_and_load); _Py_IDENTIFIER(_handle_fromlist); + _Py_IDENTIFIER(_lock_unlock_module); _Py_static_string(single_dot, "."); PyObject *abs_name = NULL; PyObject *builtins_import = NULL; @@ -1675,16 +1677,48 @@ PyImport_ImportModuleLevelObject(PyObjec goto error_with_unlock; } else if (mod != NULL) { + PyObject *value; + int initializing = 0; + Py_INCREF(mod); + /* Only call _bootstrap._lock_unlock_module() if __initializing__ is true. */ + value = _PyObject_GetAttrId(mod, &PyId___initializing__); + if (value == NULL) + PyErr_Clear(); + else { + initializing = PyObject_IsTrue(value); + Py_DECREF(value); + if (initializing == -1) + PyErr_Clear(); + } + if (initializing > 0) { + /* _bootstrap._lock_unlock_module() releases the import lock */ + value = _PyObject_CallMethodObjIdArgs(interp->importlib, + &PyId__lock_unlock_module, abs_name, + NULL); + if (value == NULL) + goto error; + Py_DECREF(value); + } + else { +#ifdef WITH_THREAD + if (_PyImport_ReleaseLock() < 0) { + PyErr_SetString(PyExc_RuntimeError, "not holding the import lock"); + goto error; + } +#endif + } } else { + /* _bootstrap._find_and_load() releases the import lock */ mod = _PyObject_CallMethodObjIdArgs(interp->importlib, &PyId__find_and_load, abs_name, builtins_import, NULL); if (mod == NULL) { - goto error_with_unlock; + goto error; } } + /* From now on we don't hold the import lock anymore. */ if (PyObject_Not(fromlist)) { if (level == 0 || PyUnicode_GET_LENGTH(name) > 0) { @@ -1693,12 +1727,12 @@ PyImport_ImportModuleLevelObject(PyObjec PyObject *borrowed_dot = _PyUnicode_FromId(&single_dot); if (borrowed_dot == NULL) { - goto error_with_unlock; + goto error; } partition = PyUnicode_Partition(name, borrowed_dot); if (partition == NULL) { - goto error_with_unlock; + goto error; } front = PyTuple_GET_ITEM(partition, 0); @@ -1724,7 +1758,7 @@ PyImport_ImportModuleLevelObject(PyObjec abs_name_len - cut_off); Py_DECREF(front); if (to_return == NULL) { - goto error_with_unlock; + goto error; } final_mod = PyDict_GetItem(interp->modules, to_return); @@ -1750,6 +1784,8 @@ PyImport_ImportModuleLevelObject(PyObjec fromlist, builtins_import, NULL); } + goto error; + error_with_unlock: #ifdef WITH_THREAD if (_PyImport_ReleaseLock() < 0) { diff --git a/Python/importlib.h b/Python/importlib.h index e9f5faf2fa9b7e239563aff1db46d6e1d70fcb88..83c792a2e46befc55b6152c3dde5606e38e6a512 GIT binary patch literal 184458 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