/* This is the main function. Read this to understand how the
* collection process works. */
static Py_ssize_t
-collect(PyThreadState *tstate, int generation,
- Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable, int nofail)
+gc_collect_main(PyThreadState *tstate, int generation,
+ Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable,
+ int nofail)
{
int i;
Py_ssize_t m = 0; /* # objects collected */
* progress callbacks.
*/
static Py_ssize_t
-collect_with_callback(PyThreadState *tstate, int generation)
+gc_collect_with_callback(PyThreadState *tstate, int generation)
{
assert(!_PyErr_Occurred(tstate));
Py_ssize_t result, collected, uncollectable;
invoke_gc_callback(tstate, "start", generation, 0, 0);
- result = collect(tstate, generation, &collected, &uncollectable, 0);
+ result = gc_collect_main(tstate, generation, &collected, &uncollectable, 0);
invoke_gc_callback(tstate, "stop", generation, collected, uncollectable);
assert(!_PyErr_Occurred(tstate));
return result;
}
static Py_ssize_t
-collect_generations(PyThreadState *tstate)
+gc_collect_generations(PyThreadState *tstate)
{
GCState *gcstate = &tstate->interp->gc;
/* Find the oldest generation (highest numbered) where the count
if (i == NUM_GENERATIONS - 1
&& gcstate->long_lived_pending < gcstate->long_lived_total / 4)
continue;
- n = collect_with_callback(tstate, i);
+ n = gc_collect_with_callback(tstate, i);
break;
}
}
}
else {
gcstate->collecting = 1;
- n = collect_with_callback(tstate, generation);
+ n = gc_collect_with_callback(tstate, generation);
gcstate->collecting = 0;
}
return n;
return m;
}
-/* API to invoke gc.collect() from C */
+/* Public API to invoke gc.collect() from C */
Py_ssize_t
PyGC_Collect(void)
{
PyObject *exc, *value, *tb;
gcstate->collecting = 1;
_PyErr_Fetch(tstate, &exc, &value, &tb);
- n = collect_with_callback(tstate, NUM_GENERATIONS - 1);
+ n = gc_collect_with_callback(tstate, NUM_GENERATIONS - 1);
_PyErr_Restore(tstate, exc, value, tb);
gcstate->collecting = 0;
}
}
Py_ssize_t
-_PyGC_CollectIfEnabled(void)
+_PyGC_CollectNoFail(PyThreadState *tstate)
{
- return PyGC_Collect();
-}
-
-Py_ssize_t
-_PyGC_CollectNoFail(void)
-{
- PyThreadState *tstate = _PyThreadState_GET();
assert(!_PyErr_Occurred(tstate));
GCState *gcstate = &tstate->interp->gc;
- Py_ssize_t n;
/* Ideally, this function is only called on interpreter shutdown,
and therefore not recursively. Unfortunately, when there are daemon
See http://bugs.python.org/issue8713#msg195178 for an example.
*/
if (gcstate->collecting) {
- n = 0;
- }
- else {
- gcstate->collecting = 1;
- n = collect(tstate, NUM_GENERATIONS - 1, NULL, NULL, 1);
- gcstate->collecting = 0;
+ return 0;
}
+
+ Py_ssize_t n;
+ gcstate->collecting = 1;
+ n = gc_collect_main(tstate, NUM_GENERATIONS - 1, NULL, NULL, 1);
+ gcstate->collecting = 0;
return n;
}
!_PyErr_Occurred(tstate))
{
gcstate->collecting = 1;
- collect_generations(tstate);
+ gc_collect_generations(tstate);
gcstate->collecting = 0;
}
PyObject *op = FROM_GC(g);