https://github.com/python/cpython/commit/2e91578a76d38fa8895fce95e2661618c3de892c
commit: 2e91578a76d38fa8895fce95e2661618c3de892c
branch: main
author: Donghee Na <[email protected]>
committer: corona10 <[email protected]>
date: 2024-03-03T06:44:16+09:00
summary:
gh-115103: Update refleak checker to trigger _PyMem_ProcessDelayed (gh-116238)
files:
M Python/gc_free_threading.c
diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c
index d4fb50106093ee..18893c6c391fff 100644
--- a/Python/gc_free_threading.c
+++ b/Python/gc_free_threading.c
@@ -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);
_______________________________________________
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]