mirror of https://github.com/python/cpython
gh-115103: Update refleak checker to trigger _PyMem_ProcessDelayed (gh-116238)
This commit is contained in:
parent
140d9ec4bc
commit
2e91578a76
|
@ -324,6 +324,23 @@ merge_all_queued_objects(PyInterpreterState *interp, struct collection_state *st
|
|||
HEAD_UNLOCK(&_PyRuntime);
|
||||
}
|
||||
|
||||
static void
|
||||
process_delayed_frees(PyInterpreterState *interp)
|
||||
{
|
||||
// In STW status, we can observe the latest write sequence by
|
||||
// advancing the write sequence immediately.
|
||||
_Py_qsbr_advance(&interp->qsbr);
|
||||
_PyThreadStateImpl *current_tstate = (_PyThreadStateImpl *)_PyThreadState_GET();
|
||||
_Py_qsbr_quiescent_state(current_tstate->qsbr);
|
||||
HEAD_LOCK(&_PyRuntime);
|
||||
PyThreadState *tstate = interp->threads.head;
|
||||
while (tstate != NULL) {
|
||||
_PyMem_ProcessDelayed(tstate);
|
||||
tstate = (PyThreadState *)tstate->next;
|
||||
}
|
||||
HEAD_UNLOCK(&_PyRuntime);
|
||||
}
|
||||
|
||||
// Subtract an incoming reference from the computed "gc_refs" refcount.
|
||||
static int
|
||||
visit_decref(PyObject *op, void *arg)
|
||||
|
@ -1006,6 +1023,7 @@ gc_collect_internal(PyInterpreterState *interp, struct collection_state *state)
|
|||
_PyEval_StopTheWorld(interp);
|
||||
// merge refcounts for all queued objects
|
||||
merge_all_queued_objects(interp, state);
|
||||
process_delayed_frees(interp);
|
||||
|
||||
// Find unreachable objects
|
||||
int err = deduce_unreachable_heap(interp, state);
|
||||
|
|
Loading…
Reference in New Issue