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,121 @@ 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)) + + +# 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: + 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 +373,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 +1040,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 +1071,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 +1117,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 +1142,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 +1270,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,110 @@ +from importlib import _bootstrap +try: + import threading +except ImportError: + threading = None +import time +import unittest +import weakref + +from test import support +from test import lock_tests + + +LockType = _bootstrap._ModuleLock +DeadlockError = _bootstrap._DeadlockError +Bunch = lock_tests.Bunch + + +@unittest.skipUnless(threading, "threads needed for this test") +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 + + +@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() + 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..439b594b2d31c0f5d2a7f4eeeedbcb9b2cd7b23f GIT binary patch literal 182065 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

DHyzPi<>PP!9aT=q| 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 O|NS5Sn?L;3U;jUc6B7df