cpython: f0833e6ff2d2 (original) (raw)

Mercurial > cpython

changeset 83650:f0833e6ff2d2

Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown. [#1545463]

Antoine Pitrou solipsis@pitrou.net
date Mon, 06 May 2013 21:15:57 +0200
parents 6d971b172389
children 557599a32821
files Include/pythonrun.h Lib/test/test_gc.py Misc/NEWS Modules/gcmodule.c Python/import.c Python/pythonrun.c
diffstat 6 files changed, 56 insertions(+), 5 deletions(-)[+] [-] Include/pythonrun.h 1 Lib/test/test_gc.py 36 Misc/NEWS 3 Modules/gcmodule.c 8 Python/import.c 8 Python/pythonrun.c 5

line wrap: on

line diff

--- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -217,6 +217,7 @@ PyAPI_FUNC(void) PyBytes_Fini(void); PyAPI_FUNC(void) PyByteArray_Fini(void); PyAPI_FUNC(void) PyFloat_Fini(void); PyAPI_FUNC(void) PyOS_FiniInterrupts(void); +PyAPI_FUNC(void) _PyGC_DumpShutdownStats(void); PyAPI_FUNC(void) _PyGC_Fini(void); PyAPI_FUNC(void) PySlice_Fini(void); PyAPI_FUNC(void) _PyType_Fini(void);

--- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -1,6 +1,8 @@ import unittest from test.support import (verbose, refcount_test, run_unittest, strip_python_stderr) +from test.script_helper import assert_python_ok, make_script, temp_dir + import sys import time import gc @@ -610,6 +612,40 @@ class GCTests(unittest.TestCase): stderr = run_command(code % "gc.DEBUG_SAVEALL") self.assertNotIn(b"uncollectable objects at shutdown", stderr)

+

+ def test_get_stats(self): stats = gc.get_stats() self.assertEqual(len(stats), 3)

--- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.4.0 Alpha 1? Core and Builtins ----------------- +- Issue #1545463: Global variables caught in reference cycles are now

--- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1544,8 +1544,9 @@ PyGC_Collect(void) return n; } + void -_PyGC_Fini(void) +_PyGC_DumpShutdownStats(void) { if (!(debug & DEBUG_SAVEALL) && garbage != NULL && PyList_GET_SIZE(garbage) > 0) { @@ -1574,6 +1575,11 @@ void Py_XDECREF(bytes); } } +} + +void +_PyGC_Fini(void) +{ Py_CLEAR(callbacks); }

--- a/Python/import.c +++ b/Python/import.c @@ -403,6 +403,14 @@ PyImport_Cleanup(void) } }

+

+ /* Next, delete sys and builtins (in that order) */ value = PyDict_GetItemString(modules, "sys"); if (value != NULL && PyModule_Check(value)) {

--- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -544,10 +544,6 @@ Py_Finalize(void) while (PyGC_Collect() > 0) /* nothing */; #endif

- /* Destroy all modules */ PyImport_Cleanup(); @@ -628,6 +624,7 @@ Py_Finalize(void) PyFloat_Fini(); PyDict_Fini(); PySlice_Fini();

/* Cleanup Unicode implementation */ _PyUnicode_Fini();