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,72 @@ def _new_module(name): return type(sys)(name) +# Module-level locking + +_module_locks = {} +_blocking_on = {} + +class _ModuleLock: + + def __init__(self, name): + self.lock = _thread.RLock() + self.name = name + self.owner = None + + 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): + # XXX synchronization issues for the "owner" attribute + tid = _thread.get_ident() + _blocking_on[tid] = self + try: + if self.lock.acquire(False): + self.owner = tid + return True + if avoid_deadlocks and self.has_deadlock(): + # False positive? Try again + if not self.lock.acquire(False): + return False + else: + self.lock.acquire() + self.owner = tid + return True + finally: + del _blocking_on[tid] + + def release(self): + self.lock.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. + 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__' @@ -960,7 +1026,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 +1057,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 +1103,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 +1128,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 +1256,16 @@ def _setup(sys_module, _imp_module): continue else: raise ImportError('importlib requires posix or nt') + + try: + thread_module = BuiltinImporter.load_module('_thread') + except ImportError: + raise + # Python was built without threads + thread_module = None + setattr(self_module, '_os', os_module) + setattr(self_module, '_thread', thread_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/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -1493,6 +1493,7 @@ PyImport_ImportModuleLevelObject(PyObjec _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 +1676,25 @@ PyImport_ImportModuleLevelObject(PyObjec goto error_with_unlock; } else if (mod != NULL) { + /* _bootstrap._lock_unlock_module() releases the import lock */ + PyObject *r = _PyObject_CallMethodObjIdArgs(interp->importlib, + &PyId__lock_unlock_module, abs_name, + NULL); + if (r == NULL) + goto error; Py_INCREF(mod); + Py_DECREF(r); } 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 +1703,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 +1734,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 +1760,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..530cec30a054dcb145761ff46896b368c95243a1 GIT binary patch literal 180812 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