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,97 @@ def new_module(name): return type(_io)(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. + 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 _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__' @@ -258,12 +349,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 +1016,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 +1047,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 +1093,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 +1118,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 +1246,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/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/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..f09cf1e78bf8576a7752fb3f0c2c6dc9bee49eeb GIT binary patch literal 178511 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 MAoRt=h;Z^IS~K!gTqYZg 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