bpo-42208: Pass tstate to _PyGC_CollectNoFail() (GH-23038) · python/cpython@8b34148 (original) (raw)
`@@ -1176,8 +1176,9 @@ handle_resurrected_objects(PyGC_Head unreachable, PyGC_Head still_unreachable,
`
1176
1176
`/* This is the main function. Read this to understand how the
`
1177
1177
` * collection process works. */
`
1178
1178
`static Py_ssize_t
`
1179
``
`-
collect(PyThreadState *tstate, int generation,
`
1180
``
`-
Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable, int nofail)
`
``
1179
`+
gc_collect_main(PyThreadState *tstate, int generation,
`
``
1180
`+
Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable,
`
``
1181
`+
int nofail)
`
1181
1182
`{
`
1182
1183
`int i;
`
1183
1184
`Py_ssize_t m = 0; /* # objects collected */
`
`@@ -1395,19 +1396,19 @@ invoke_gc_callback(PyThreadState *tstate, const char *phase,
`
1395
1396
` * progress callbacks.
`
1396
1397
` */
`
1397
1398
`static Py_ssize_t
`
1398
``
`-
collect_with_callback(PyThreadState *tstate, int generation)
`
``
1399
`+
gc_collect_with_callback(PyThreadState *tstate, int generation)
`
1399
1400
`{
`
1400
1401
`assert(!_PyErr_Occurred(tstate));
`
1401
1402
`Py_ssize_t result, collected, uncollectable;
`
1402
1403
`invoke_gc_callback(tstate, "start", generation, 0, 0);
`
1403
``
`-
result = collect(tstate, generation, &collected, &uncollectable, 0);
`
``
1404
`+
result = gc_collect_main(tstate, generation, &collected, &uncollectable, 0);
`
1404
1405
`invoke_gc_callback(tstate, "stop", generation, collected, uncollectable);
`
1405
1406
`assert(!_PyErr_Occurred(tstate));
`
1406
1407
`return result;
`
1407
1408
`}
`
1408
1409
``
1409
1410
`static Py_ssize_t
`
1410
``
`-
collect_generations(PyThreadState *tstate)
`
``
1411
`+
gc_collect_generations(PyThreadState *tstate)
`
1411
1412
`{
`
1412
1413
`GCState *gcstate = &tstate->interp->gc;
`
1413
1414
`/* Find the oldest generation (highest numbered) where the count
`
`@@ -1455,7 +1456,7 @@ collect_generations(PyThreadState *tstate)
`
1455
1456
`if (i == NUM_GENERATIONS - 1
`
1456
1457
`&& gcstate->long_lived_pending < gcstate->long_lived_total / 4)
`
1457
1458
`continue;
`
1458
``
`-
n = collect_with_callback(tstate, i);
`
``
1459
`+
n = gc_collect_with_callback(tstate, i);
`
1459
1460
`break;
`
1460
1461
` }
`
1461
1462
` }
`
`@@ -1541,7 +1542,7 @@ gc_collect_impl(PyObject *module, int generation)
`
1541
1542
` }
`
1542
1543
`else {
`
1543
1544
`gcstate->collecting = 1;
`
1544
``
`-
n = collect_with_callback(tstate, generation);
`
``
1545
`+
n = gc_collect_with_callback(tstate, generation);
`
1545
1546
`gcstate->collecting = 0;
`
1546
1547
` }
`
1547
1548
`return n;
`
`@@ -2041,7 +2042,7 @@ PyInit_gc(void)
`
2041
2042
`return m;
`
2042
2043
`}
`
2043
2044
``
2044
``
`-
/* API to invoke gc.collect() from C */
`
``
2045
`+
/* Public API to invoke gc.collect() from C */
`
2045
2046
`Py_ssize_t
`
2046
2047
`PyGC_Collect(void)
`
2047
2048
`{
`
`@@ -2061,7 +2062,7 @@ PyGC_Collect(void)
`
2061
2062
`PyObject *exc, *value, *tb;
`
2062
2063
`gcstate->collecting = 1;
`
2063
2064
`_PyErr_Fetch(tstate, &exc, &value, &tb);
`
2064
``
`-
n = collect_with_callback(tstate, NUM_GENERATIONS - 1);
`
``
2065
`+
n = gc_collect_with_callback(tstate, NUM_GENERATIONS - 1);
`
2065
2066
`_PyErr_Restore(tstate, exc, value, tb);
`
2066
2067
`gcstate->collecting = 0;
`
2067
2068
` }
`
`@@ -2070,19 +2071,11 @@ PyGC_Collect(void)
`
2070
2071
`}
`
2071
2072
``
2072
2073
`Py_ssize_t
`
2073
``
`-
_PyGC_CollectIfEnabled(void)
`
``
2074
`+
_PyGC_CollectNoFail(PyThreadState *tstate)
`
2074
2075
`{
`
2075
``
`-
return PyGC_Collect();
`
2076
``
`-
}
`
2077
``
-
2078
``
`-
Py_ssize_t
`
2079
``
`-
_PyGC_CollectNoFail(void)
`
2080
``
`-
{
`
2081
``
`-
PyThreadState *tstate = _PyThreadState_GET();
`
2082
2076
`assert(!_PyErr_Occurred(tstate));
`
2083
2077
``
2084
2078
`GCState *gcstate = &tstate->interp->gc;
`
2085
``
`-
Py_ssize_t n;
`
2086
2079
``
2087
2080
`/* Ideally, this function is only called on interpreter shutdown,
`
2088
2081
` and therefore not recursively. Unfortunately, when there are daemon
`
`@@ -2091,13 +2084,13 @@ _PyGC_CollectNoFail(void)
`
2091
2084
` See http://bugs.python.org/issue8713#msg195178 for an example.
`
2092
2085
` */
`
2093
2086
`if (gcstate->collecting) {
`
2094
``
`-
n = 0;
`
2095
``
`-
}
`
2096
``
`-
else {
`
2097
``
`-
gcstate->collecting = 1;
`
2098
``
`-
n = collect(tstate, NUM_GENERATIONS - 1, NULL, NULL, 1);
`
2099
``
`-
gcstate->collecting = 0;
`
``
2087
`+
return 0;
`
2100
2088
` }
`
``
2089
+
``
2090
`+
Py_ssize_t n;
`
``
2091
`+
gcstate->collecting = 1;
`
``
2092
`+
n = gc_collect_main(tstate, NUM_GENERATIONS - 1, NULL, NULL, 1);
`
``
2093
`+
gcstate->collecting = 0;
`
2101
2094
`return n;
`
2102
2095
`}
`
2103
2096
``
`@@ -2240,7 +2233,7 @@ _PyObject_GC_Alloc(int use_calloc, size_t basicsize)
`
2240
2233
` !_PyErr_Occurred(tstate))
`
2241
2234
` {
`
2242
2235
`gcstate->collecting = 1;
`
2243
``
`-
collect_generations(tstate);
`
``
2236
`+
gc_collect_generations(tstate);
`
2244
2237
`gcstate->collecting = 0;
`
2245
2238
` }
`
2246
2239
`PyObject *op = FROM_GC(g);
`