summaryrefslogtreecommitdiff
path: root/Python
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2013-05-06 21:15:57 +0200
committerAntoine Pitrou <solipsis@pitrou.net>2013-05-06 21:15:57 +0200
commit5f454a07a054eb0db7499d8dbd537ff8ce7bda18 (patch)
tree08557fde41d4a25d1961b38face3ca46bb8c695d /Python
parent1df37c657d7b32cfc7e765f13323415ef1c5be31 (diff)
downloadcpython-git-5f454a07a054eb0db7499d8dbd537ff8ce7bda18.tar.gz
Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Diffstat (limited to 'Python')
-rw-r--r--Python/import.c8
-rw-r--r--Python/pythonrun.c5
2 files changed, 9 insertions, 4 deletions
diff --git a/Python/import.c b/Python/import.c
index b77eda106d..cd4fb788a1 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -403,6 +403,14 @@ PyImport_Cleanup(void)
}
}
+ /* Collect garbage remaining after deleting the modules. Mostly
+ reference cycles created by classes. */
+ PyGC_Collect();
+
+ /* Dump GC stats before it's too late, since it uses the warnings
+ machinery. */
+ _PyGC_DumpShutdownStats();
+
/* Next, delete sys and builtins (in that order) */
value = PyDict_GetItemString(modules, "sys");
if (value != NULL && PyModule_Check(value)) {
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 96b0988ec7..02a4329950 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -544,10 +544,6 @@ Py_Finalize(void)
while (PyGC_Collect() > 0)
/* nothing */;
#endif
- /* We run this while most interpreter state is still alive, so that
- debug information can be printed out */
- _PyGC_Fini();
-
/* Destroy all modules */
PyImport_Cleanup();
@@ -628,6 +624,7 @@ Py_Finalize(void)
PyFloat_Fini();
PyDict_Fini();
PySlice_Fini();
+ _PyGC_Fini();
/* Cleanup Unicode implementation */
_PyUnicode_Fini();