https://github.com/python/cpython/commit/985dd8e17b55ae35fc31546384fc9364f2f59f86
commit: 985dd8e17b55ae35fc31546384fc9364f2f59f86
branch: main
author: Eric Snow <[email protected]>
committer: ericsnowcurrently <[email protected]>
date: 2024-07-15T12:44:20-06:00
summary:
gh-118297: Make Sure All Pending Calls Run in _Py_FinishPendingCalls()
(gh-118298)
files:
M Python/ceval_gil.c
diff --git a/Python/ceval_gil.c b/Python/ceval_gil.c
index 5617504a495686..dc3baf79ccba62 100644
--- a/Python/ceval_gil.c
+++ b/Python/ceval_gil.c
@@ -991,12 +991,34 @@ _Py_FinishPendingCalls(PyThreadState *tstate)
assert(PyGILState_Check());
assert(_PyThreadState_CheckConsistency(tstate));
- if (make_pending_calls(tstate) < 0) {
- PyObject *exc = _PyErr_GetRaisedException(tstate);
- PyErr_BadInternalCall();
- _PyErr_ChainExceptions1(exc);
- _PyErr_Print(tstate);
- }
+ struct _pending_calls *pending = &tstate->interp->ceval.pending;
+ struct _pending_calls *pending_main =
+ _Py_IsMainThread() && _Py_IsMainInterpreter(tstate->interp)
+ ? &_PyRuntime.ceval.pending_mainthread
+ : NULL;
+ /* make_pending_calls() may return early without making all pending
+ calls, so we keep trying until we're actually done. */
+ int32_t npending;
+#ifndef NDEBUG
+ int32_t npending_prev = INT32_MAX;
+#endif
+ do {
+ if (make_pending_calls(tstate) < 0) {
+ PyObject *exc = _PyErr_GetRaisedException(tstate);
+ PyErr_BadInternalCall();
+ _PyErr_ChainExceptions1(exc);
+ _PyErr_Print(tstate);
+ }
+
+ npending = _Py_atomic_load_int32_relaxed(&pending->npending);
+ if (pending_main != NULL) {
+ npending += _Py_atomic_load_int32_relaxed(&pending_main->npending);
+ }
+#ifndef NDEBUG
+ assert(npending_prev > npending);
+ npending_prev = npending;
+#endif
+ } while (npending > 0);
}
int
_______________________________________________
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]