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,85 @@ 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. + 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 +1039,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 +1070,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 +1116,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 +1141,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 +1269,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); Py_INCREF(mod); + if (r == NULL) + goto error; + 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..428da2dcca86752df5d245e6f4a6eae5117beee6 GIT binary patch literal 182353 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 K#Sg#v?f(TQn?Aw-