Mercurial > cpython-lru_cache-weakref
diff Python/pythonrun.c @ 16073:713ed6c6bcb5 legacy-trunk
Bug #128475: mimetools.encode (sometimes) fails when called from a thread.
pythonrun.c: In Py_Finalize, don't reset the initialized flag until after
the exit funcs have run.
atexit.py: in _run_exitfuncs, mutate the list of pending calls in a
threadsafe way. This wasn't a contributor to bug 128475, it just burned
my eyeballs when looking at that bug.
| author | Tim Peters <tim.peters@gmail.com> |
|---|---|
| date | Sun, 21 Jan 2001 03:40:37 +0000 |
| parents | cf17a3ce5387 |
| children | 8c41f3861aad |
line wrap: on
line diff
--- a/Python/pythonrun.c Sat Jan 20 23:34:12 2001 +0000 +++ b/Python/pythonrun.c Sun Jan 21 03:40:37 2001 +0000 @@ -181,10 +181,19 @@ if (!initialized) return; + + /* The interpreter is still entirely intact at this point, and the + * exit funcs may be relying on that. In particular, if some thread + * or exit func is still waiting to do an import, the import machinery + * expects Py_IsInitialized() to return true. So don't say the + * interpreter is uninitialized until after the exit funcs have run. + * Note that Threading.py uses an exit func to do a join on all the + * threads created thru it, so this also protects pending imports in + * the threads created via Threading. + */ + call_sys_exitfunc(); initialized = 0; - call_sys_exitfunc(); - /* Get current thread state and interpreter pointer */ tstate = PyThreadState_Get(); interp = tstate->interp;
