]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-115103: Update refleak checker to trigger _PyMem_ProcessDelayed (gh-116238)
authorDonghee Na <donghee.na@python.org>
Sat, 2 Mar 2024 21:44:16 +0000 (06:44 +0900)
committerGitHub <noreply@github.com>
Sat, 2 Mar 2024 21:44:16 +0000 (06:44 +0900)
Python/gc_free_threading.c

index d4fb50106093ee67f93a56ca7f410300d0264f1d..18893c6c391ffff31dd204be6687e950895af87c 100644 (file)
@@ -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);