From e13ddc9ec85287b17fd03454f836f495c1167de9 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Thu, 17 Apr 2003 17:29:22 +0000 Subject: - New C API PyGC_Collect(), same as calling gc.collect(). - Call this in Py_Finalize(). - Expand the Misc/NEWS text on PY_LONG_LONG. --- Include/objimpl.h | 3 +++ Misc/NEWS | 8 +++++++- Modules/gcmodule.c | 20 +++++++++++++++++++- Python/pythonrun.c | 8 ++++++++ 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(); -- cgit v0.12