]> granicus.if.org Git - python/commitdiff
- New C API PyGC_Collect(), same as calling gc.collect().
authorGuido van Rossum <guido@python.org>
Thu, 17 Apr 2003 17:29:22 +0000 (17:29 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 17 Apr 2003 17:29:22 +0000 (17:29 +0000)
- Call this in Py_Finalize().
- Expand the Misc/NEWS text on PY_LONG_LONG.

Include/objimpl.h
Misc/NEWS
Modules/gcmodule.c
Python/pythonrun.c

index 2b35e67452a1e18c836070b0750ab0a29cf859ee..3679cbad1bf11286f65233081895fcc1ddb4bfc6 100644 (file)
@@ -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)
 
index 0c96ac9cc6e36571c3efd14be5b2a9f48311ab98..7efea390bb16c7919abfde5df10f7963b5a3631a 100644 (file)
--- 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.
index 4fd402788da3308a6ef8f59fce661819803d5341..bb40b8f9c7c1001cbd71936c92a2713d24226cf1 100644 (file)
@@ -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));
 }
index a84186c88846e4249704500bc7cefbd4b5b96778..4cfb664a27ad2b7d3d0b5295d1ab92205ccba2e8 100644 (file)
@@ -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();