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)
_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);