https://github.com/python/cpython/commit/49b1fb43f65290dadeb83ed6f7c0c74995fda7a1
commit: 49b1fb43f65290dadeb83ed6f7c0c74995fda7a1
branch: main
author: Kevin Wang <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2025-12-10T07:29:40Z
summary:
gh-142048: Fix lost gc allocations count on thread cleanup (#142233)
files:
M Python/pystate.c
diff --git a/Python/pystate.c b/Python/pystate.c
index 2956e785405a0e..4bf89a234266e4 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -1765,16 +1765,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.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]