[3.14] gh-142048: Fix lost gc allocations count on thread cleanup (GH-142233) (#142504)

gh-142048: Fix lost gc allocations count on thread cleanup (GH-142233)
(cherry picked from commit 49b1fb43f6)

Co-authored-by: Kevin Wang <kevmo314@gmail.com>
This commit is contained in:
Miss Islington (bot) 2025-12-10 11:52:55 +01:00 committed by GitHub
parent d14697db18
commit 0114178911
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1815,16 +1815,23 @@ PyThreadState_Clear(PyThreadState *tstate)
struct _Py_freelists *freelists = _Py_freelists_GET();
_PyObject_ClearFreeLists(freelists, 1);
// Flush the thread's local GC allocation count to the global count
// before the thread state is cleared, otherwise the count is lost.
_PyThreadStateImpl *tstate_impl = (_PyThreadStateImpl *)tstate;
_Py_atomic_add_int(&tstate->interp->gc.young.count,
(int)tstate_impl->gc.alloc_count);
tstate_impl->gc.alloc_count = 0;
// Merge our thread-local refcounts into the type's own refcount and
// free our local refcount array.
_PyObject_FinalizePerThreadRefcounts((_PyThreadStateImpl *)tstate);
_PyObject_FinalizePerThreadRefcounts(tstate_impl);
// Remove ourself from the biased reference counting table of threads.
_Py_brc_remove_thread(tstate);
// Release our thread-local copies of the bytecode for reuse by another
// thread
_Py_ClearTLBCIndex((_PyThreadStateImpl *)tstate);
_Py_ClearTLBCIndex(tstate_impl);
#endif
// Merge our queue of pointers to be freed into the interpreter queue.