summaryrefslogtreecommitdiffstats
path: root/Python/pythonrun.c
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2013-05-05 06:14:53 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2013-05-05 06:14:53 (GMT)
commit4adb566ad78026e9eb5cec113ba7433e81c180bd (patch)
tree41ec19d98d3eefc281939c7c17ce97293a31e36f /Python/pythonrun.c
parent0470cc9416463820e7928ac3e4c31a45ba532d79 (diff)
parentfd417cc54bc71fb294c4f9889441929d3e8b3dcc (diff)
downloadcpython-4adb566ad78026e9eb5cec113ba7433e81c180bd.zip
cpython-4adb566ad78026e9eb5cec113ba7433e81c180bd.tar.gz
cpython-4adb566ad78026e9eb5cec113ba7433e81c180bd.tar.bz2
Fix crash caused by 8c1385205a35
(thanks Arfrever for reporting).
Diffstat (limited to 'Python/pythonrun.c')
-rw-r--r--Python/pythonrun.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index cf2ecf1..96b0988 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -576,6 +576,9 @@ Py_Finalize(void)
/* Destroy the database used by _PyImport_{Fixup,Find}Extension */
_PyImport_Fini();
+ /* Cleanup typeobject.c's internal caches. */
+ _PyType_Fini();
+
/* unload faulthandler module */
_PyFaulthandler_Fini();
@@ -596,7 +599,7 @@ Py_Finalize(void)
_Py_PrintReferences(stderr);
#endif /* Py_TRACE_REFS */
- /* Clear interpreter state */
+ /* Clear interpreter state and all thread states. */
PyInterpreterState_Clear(interp);
/* Now we decref the exception classes. After this point nothing
@@ -612,10 +615,6 @@ Py_Finalize(void)
_PyGILState_Fini();
#endif /* WITH_THREAD */
- /* Delete current thread */
- PyThreadState_Swap(NULL);
- PyInterpreterState_Delete(interp);
-
/* Sundry finalizers */
PyMethod_Fini();
PyFrame_Fini();
@@ -629,11 +628,14 @@ Py_Finalize(void)
PyFloat_Fini();
PyDict_Fini();
PySlice_Fini();
- _PyType_Fini();
/* Cleanup Unicode implementation */
_PyUnicode_Fini();
+ /* Delete current thread. After this, many C API calls become crashy. */
+ PyThreadState_Swap(NULL);
+ PyInterpreterState_Delete(interp);
+
/* reset file system default encoding */
if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) {
free((char*)Py_FileSystemDefaultEncoding);