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);

`