diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -159,6 +159,145 @@ def new_module(name): return type(_io)(name) +# Module-level locking ######################################################## + +# A dict mapping module names to weakrefs of _ModuleLock instances +_module_locks = {} +# A dict mapping thread ids to _ModuleLock instances +_blocking_on = {} + + +class _DeadlockError(RuntimeError): + pass + + +class _ModuleLock: + """A recursive lock implementation which is able to detect deadlocks + (e.g. thread 1 trying to take locks A then B, and thread 2 trying to + take locks B then A). + """ + + 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): + """ + Acquire the module lock. If a potential deadlock is detected, + a _DeadlockError is raised. + Otherwise, the lock is always acquired and True is returned. + """ + 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 self.has_deadlock(): + raise _DeadlockError("deadlock detected by %r" % self) + if self.wakeup.acquire(False): + self.waiters += 1 + # Wait for a release() call + self.wakeup.acquire() + self.wakeup.release() + finally: + del _blocking_on[tid] + + def release(self): + tid = _thread.get_ident() + with self.lock: + if self.owner != tid: + raise RuntimeError("cannot release un-acquired lock") + 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)) + + +class _DummyModuleLock: + """A simple _ModuleLock equivalent for Python builds without + multi-threading support.""" + + def __init__(self, name): + self.name = name + self.count = 0 + + def acquire(self): + self.count += 1 + return True + + def release(self): + if self.count == 0: + raise RuntimeError("cannot release un-acquired lock") + self.count -= 1 + + def __repr__(self): + return "_DummyModuleLock(%r) at %d" % (self.name, id(self)) + + +# The following two functions are for consumption by Python/import.c. + +def _get_module_lock(name): + """Get or create the module lock for a given module 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: + if _thread is None: + lock = _DummyModuleLock(name) + else: + lock = _ModuleLock(name) + def cb(_): + del _module_locks[name] + _module_locks[name] = _weakref.ref(lock, cb) + return lock + +def _lock_unlock_module(name): + """Release the global import lock, and acquires then release the + module lock for a given module name. + This is used to ensure a module is completely initialized, in the + event it is being imported by another thread. + + Should only be called with the import lock taken.""" + lock = _get_module_lock(name) + _imp.release_lock() + try: + lock.acquire() + except _DeadlockError: + # Concurrent circular import, we'll accept a partially initialized + # module object. + pass + else: + lock.release() + + # Finder/loader utility code ################################################## _PYCACHE = '__pycache__' @@ -258,12 +397,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: + module.__initializing__ = False _wrap(module_for_loader_wrapper, fxn) return module_for_loader_wrapper @@ -922,7 +1064,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: @@ -952,8 +1095,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: @@ -999,6 +1141,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. @@ -1011,17 +1166,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_): @@ -1139,7 +1294,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/importlib/test/test_locks.py b/Lib/importlib/test/test_locks.py new file mode 100644 --- /dev/null +++ b/Lib/importlib/test/test_locks.py @@ -0,0 +1,115 @@ +from importlib import _bootstrap +import time +import unittest +import weakref + +from test import support + +try: + import threading +except ImportError: + threading = None +else: + from test import lock_tests + + +LockType = _bootstrap._ModuleLock +DeadlockError = _bootstrap._DeadlockError + + +if threading is not None: + class ModuleLockAsRLockTests(lock_tests.RLockTests): + locktype = staticmethod(lambda: LockType("some_lock")) + + # _is_owned() unsupported + test__is_owned = None + # acquire(blocking=False) unsupported + test_try_acquire = None + test_try_acquire_contended = None + # `with` unsupported + test_with = None + # acquire(timeout=...) unsupported + test_timeout = None + # _release_save() unsupported + test_release_save_unacquired = None + +else: + class ModuleLockAsRLockTests(unittest.TestCase): + pass + + +@unittest.skipUnless(threading, "threads needed for this test") +class DeadlockAvoidanceTests(unittest.TestCase): + + def run_deadlock_avoidance_test(self, create_deadlock): + NLOCKS = 10 + locks = [LockType(str(i)) for i in range(NLOCKS)] + pairs = [(locks[i], locks[(i+1)%NLOCKS]) for i in range(NLOCKS)] + if create_deadlock: + NTHREADS = NLOCKS + else: + NTHREADS = NLOCKS - 1 + barrier = threading.Barrier(NTHREADS) + results = [] + def _acquire(lock): + """Try to acquire the lock. Return True on success, False on deadlock.""" + try: + lock.acquire() + except DeadlockError: + return False + else: + return True + def f(): + a, b = pairs.pop() + ra = _acquire(a) + barrier.wait() + rb = _acquire(b) + results.append((ra, rb)) + if rb: + b.release() + if ra: + a.release() + lock_tests.Bunch(f, NTHREADS).wait_for_finished() + self.assertEqual(len(results), NTHREADS) + return results + + def test_deadlock(self): + results = self.run_deadlock_avoidance_test(True) + # One of the threads detected a potential deadlock on its second + # acquire() call. + self.assertEqual(results.count((True, False)), 1) + self.assertEqual(results.count((True, True)), len(results) - 1) + + def test_no_deadlock(self): + results = self.run_deadlock_avoidance_test(False) + self.assertEqual(results.count((True, False)), 0) + self.assertEqual(results.count((True, True)), len(results)) + + +class LifetimeTests(unittest.TestCase): + + def test_lock_lifetime(self): + name = "xyzzy" + self.assertNotIn(name, _bootstrap._module_locks) + lock = _bootstrap._get_module_lock(name) + self.assertIn(name, _bootstrap._module_locks) + wr = weakref.ref(lock) + del lock + support.gc_collect() + self.assertNotIn(name, _bootstrap._module_locks) + self.assertIs(wr(), None) + + def test_all_locks(self): + support.gc_collect() + self.assertEqual(0, len(_bootstrap._module_locks)) + + +@support.reap_threads +def test_main(): + support.run_unittest(ModuleLockAsRLockTests, + DeadlockAvoidanceTests, + LifetimeTests) + + +if __name__ == '__main__': + test_main() diff --git a/Lib/pydoc.py b/Lib/pydoc.py --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -166,7 +166,7 @@ def visiblename(name, all=None, obj=None if name in {'__builtins__', '__doc__', '__file__', '__path__', '__module__', '__name__', '__slots__', '__package__', '__cached__', '__author__', '__credits__', '__date__', - '__version__', '__qualname__'}: + '__version__', '__qualname__', '__initializing__'}: return 0 # Private names are hidden, but special names are displayed. if name.startswith('__') and name.endswith('__'): return 1 diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py --- a/Lib/test/lock_tests.py +++ b/Lib/test/lock_tests.py @@ -247,7 +247,6 @@ class RLockTests(BaseLockTests): # Cannot release an unacquired lock lock = self.locktype() self.assertRaises(RuntimeError, lock.release) - self.assertRaises(RuntimeError, lock._release_save) lock.acquire() lock.acquire() lock.release() @@ -255,6 +254,17 @@ class RLockTests(BaseLockTests): lock.release() lock.release() self.assertRaises(RuntimeError, lock.release) + + def test_release_save_unacquired(self): + # Cannot _release_save an unacquired lock + lock = self.locktype() + self.assertRaises(RuntimeError, lock._release_save) + lock.acquire() + lock.acquire() + lock.release() + lock.acquire() + lock.release() + lock.release() self.assertRaises(RuntimeError, lock._release_save) def test_different_thread(self): diff --git a/Lib/test/test_pkg.py b/Lib/test/test_pkg.py --- a/Lib/test/test_pkg.py +++ b/Lib/test/test_pkg.py @@ -23,6 +23,8 @@ def cleanout(root): def fixdir(lst): if "__builtins__" in lst: lst.remove("__builtins__") + if "__initializing__" in lst: + lst.remove("__initializing__") return lst 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 @@ -1370,47 +1370,7 @@ PyImport_ImportModule(const char *name) PyObject * PyImport_ImportModuleNoBlock(const char *name) { - PyObject *nameobj, *modules, *result; -#ifdef WITH_THREAD - long me; -#endif - - /* Try to get the module from sys.modules[name] */ - modules = PyImport_GetModuleDict(); - if (modules == NULL) - return NULL; - - nameobj = PyUnicode_FromString(name); - if (nameobj == NULL) - return NULL; - result = PyDict_GetItem(modules, nameobj); - if (result != NULL) { - Py_DECREF(nameobj); - Py_INCREF(result); - return result; - } - PyErr_Clear(); -#ifdef WITH_THREAD - /* check the import lock - * me might be -1 but I ignore the error here, the lock function - * takes care of the problem */ - me = PyThread_get_thread_ident(); - if (import_lock_thread == -1 || import_lock_thread == me) { - /* no thread or me is holding the lock */ - result = PyImport_Import(nameobj); - } - else { - PyErr_Format(PyExc_ImportError, - "Failed to import %R because the import lock" - "is held by another thread.", - nameobj); - result = NULL; - } -#else - result = PyImport_Import(nameobj); -#endif - Py_DECREF(nameobj); - return result; + return PyImport_ImportModule(name); } @@ -1420,11 +1380,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; @@ -1607,16 +1569,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) { @@ -1625,12 +1619,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; } if (PyUnicode_GET_LENGTH(PyTuple_GET_ITEM(partition, 1)) == 0) { @@ -1638,7 +1632,7 @@ PyImport_ImportModuleLevelObject(PyObjec Py_DECREF(partition); final_mod = mod; Py_INCREF(mod); - goto exit_with_unlock; + goto error; } front = PyTuple_GET_ITEM(partition, 0); @@ -1657,7 +1651,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); @@ -1683,8 +1677,8 @@ PyImport_ImportModuleLevelObject(PyObjec fromlist, builtins_import, NULL); } + goto error; - exit_with_unlock: error_with_unlock: #ifdef WITH_THREAD if (_PyImport_ReleaseLock() < 0) { diff --git a/Python/importlib.h b/Python/importlib.h index c88fc8018149bd01cc54b8759f937df81e7016cc..e7c704696280d4675a2c4fdad9ff37b9e43134da GIT binary patch literal 186856 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 K@Y`Sh)&CExDt7Mx