diff options
-rw-r--r-- | Include/objimpl.h | 3 | ||||
-rw-r--r-- | Misc/NEWS | 8 | ||||
-rw-r--r-- | Modules/gcmodule.c | 20 | ||||
-rw-r--r-- | 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) @@ -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(); |