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,110 @@ 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 _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, avoid_deadlocks=False): + """ + Acquire the module lock. If `avoid_deadlocks` is True and a + potential deadlock is detected, the lock isn't acquired and False + is returned. + 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 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: + 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() + if lock.acquire(avoid_deadlocks=True): + lock.release() + + # Finder/loader utility code ################################################## _PYCACHE = '__pycache__' @@ -258,12 +362,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 +1029,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 +1060,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 +1106,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 +1131,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 +1259,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,101 @@ +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 +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 f(): + a, b = pairs.pop() + ra = a.acquire(avoid_deadlocks=True) + barrier.wait() + rb = b.acquire(avoid_deadlocks=True) + 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; } front = PyTuple_GET_ITEM(partition, 0); @@ -1656,7 +1650,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); @@ -1682,6 +1676,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 292308fc78123e9fa10c7131bb110c47559975dd..ae4668cc576b02da172e73b3fe707fd5fc588a35 GIT binary patch literal 181213 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%0AybYu{+lo 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 P_y6;6|HE&8`B(oxiFSDa