summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/objimpl.h3
-rw-r--r--Misc/NEWS8
-rw-r--r--Modules/gcmodule.c20
-rw-r--r--Python/pythonrun.c8
4 files changed, 37 insertions, 2 deletions
diff --git a/Include/objimpl.h b/Include/objimpl.h
index 2b35e67..3679cba 100644
--- a/Include/objimpl.h
+++ b/Include/objimpl.h
@@ -228,6 +228,9 @@ PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, int);
* ==========================
*/
+/* C equivalent of gc.collect(). */
+long PyGC_Collect(void);
+
/* Test if a type has a GC head */
#define PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC)
diff --git a/Misc/NEWS b/Misc/NEWS
index 0c96ac9..7efea39 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -169,11 +169,17 @@ Build
C API
-----
+- Added PyGC_Collect(), equivalent to calling gc.collect().
+
- PyThreadState_GetDict() was changed not to raise an exception or
issue a fatal error when no current thread state is available. This
makes it possible to print dictionaries when no thread is active.
-- LONG_LONG was renamed to PY_LONG_LONG.
+- LONG_LONG was renamed to PY_LONG_LONG. Extensions that use this and
+ need compatibility with previous versions can use this:
+ #ifndef PY_LONG_LONG
+ #define PY_LONG_LONG LONG_LONG
+ #endif
- Added PyObject_SelfIter() to fill the tp_iter slot for the
typical case where the method returns its self argument.
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index 4fd4027..bb40b8f 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -980,8 +980,26 @@ initgc(void)
#undef ADD_INT
}
+/* API to invoke gc.collect() from C */
+long
+PyGC_Collect(void)
+{
+ long n;
+
+ if (collecting)
+ n = 0; /* already collecting, don't do anything */
+ else {
+ collecting = 1;
+ n = collect(NUM_GENERATIONS - 1);
+ collecting = 0;
+ }
+
+ return n;
+}
+
/* for debugging */
-void _PyGC_Dump(PyGC_Head *g)
+void
+_PyGC_Dump(PyGC_Head *g)
{
_PyObject_Dump(FROM_GC(g));
}
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index a84186c..4cfb664 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -255,9 +255,17 @@ Py_Finalize(void)
Py_XDECREF(PyModule_WarningsModule);
PyModule_WarningsModule = NULL;
+ /* Collect garbage. This may call finalizers; it's nice to call these
+ before all modules are destroyed. */
+ PyGC_Collect();
+
/* Destroy all modules */
PyImport_Cleanup();
+ /* Collect final garbage. This disposes of cycles created by
+ new-style class definitions, for example. */
+ PyGC_Collect();
+
/* Destroy the database used by _PyImport_{Fixup,Find}Extension */
_PyImport_Fini();