From 384fd106e89ec859ace7c098620aad8ce2c2abaa Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Sun, 21 Jan 2001 03:40:37 +0000 Subject: 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. --- Python/pythonrun.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'Python/pythonrun.c') diff --git a/Python/pythonrun.c b/Python/pythonrun.c index ff2142b807d..4c94f9b6a90 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -181,9 +181,18 @@ Py_Finalize(void) if (!initialized) return; - initialized = 0; + /* 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; /* Get current thread state and interpreter pointer */ tstate = PyThreadState_Get(); -- cgit v1.2.3