[Python-checkins] bpo-39984: Pass tstate to handle_signals() (GH-19050)

Victor Stinner webhook-mailer at python.org
Tue Mar 17 20:56:25 EDT 2020


https://github.com/python/cpython/commit/d7fabc116269e4650a684eb04f9ecd84421aa247
commit: d7fabc116269e4650a684eb04f9ecd84421aa247
branch: master
author: Victor Stinner <vstinner at python.org>
committer: GitHub <noreply at github.com>
date: 2020-03-18T01:56:21+01:00
summary:

bpo-39984: Pass tstate to handle_signals() (GH-19050)

handle_signals() and make_pending_calls() now expect tstate rather
than runtime.

files:
M Python/ceval.c

diff --git a/Python/ceval.c b/Python/ceval.c
index 8835c3eb3f921..b055d61c08412 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -506,8 +506,10 @@ Py_AddPendingCall(int (*func)(void *), void *arg)
 }
 
 static int
-handle_signals(_PyRuntimeState *runtime)
+handle_signals(PyThreadState *tstate)
 {
+    _PyRuntimeState *runtime = tstate->interp->runtime;
+
     /* Only handle signals on main thread */
     if (PyThread_get_thread_ident() != runtime->main_thread) {
         return 0;
@@ -516,7 +518,7 @@ handle_signals(_PyRuntimeState *runtime)
      * Ensure that the thread isn't currently running some other
      * interpreter.
      */
-    PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp;
+    PyInterpreterState *interp = tstate->interp;
     if (interp != runtime->interpreters.main) {
         return 0;
     }
@@ -531,10 +533,12 @@ handle_signals(_PyRuntimeState *runtime)
 }
 
 static int
-make_pending_calls(_PyRuntimeState *runtime)
+make_pending_calls(PyThreadState *tstate)
 {
     static int busy = 0;
 
+    _PyRuntimeState *runtime = tstate->interp->runtime;
+
     /* only service pending calls on main thread */
     if (PyThread_get_thread_ident() != runtime->main_thread) {
         return 0;
@@ -586,8 +590,7 @@ _Py_FinishPendingCalls(PyThreadState *tstate)
 {
     assert(PyGILState_Check());
 
-    _PyRuntimeState *runtime = tstate->interp->runtime;
-    struct _pending_calls *pending = &runtime->ceval.pending;
+    struct _pending_calls *pending = &tstate->interp->runtime->ceval.pending;
 
     PyThread_acquire_lock(pending->lock, WAIT_LOCK);
     pending->finishing = 1;
@@ -597,7 +600,7 @@ _Py_FinishPendingCalls(PyThreadState *tstate)
         return;
     }
 
-    if (make_pending_calls(runtime) < 0) {
+    if (make_pending_calls(tstate) < 0) {
         PyObject *exc, *val, *tb;
         _PyErr_Fetch(tstate, &exc, &val, &tb);
         PyErr_BadInternalCall();
@@ -613,15 +616,16 @@ Py_MakePendingCalls(void)
 {
     assert(PyGILState_Check());
 
+    PyThreadState *tstate = _PyThreadState_GET();
+
     /* Python signal handler doesn't really queue a callback: it only signals
        that a signal was received, see _PyEval_SignalReceived(). */
-    _PyRuntimeState *runtime = &_PyRuntime;
-    int res = handle_signals(runtime);
+    int res = handle_signals(tstate);
     if (res != 0) {
         return res;
     }
 
-    res = make_pending_calls(runtime);
+    res = make_pending_calls(tstate);
     if (res != 0) {
         return res;
     }
@@ -1231,12 +1235,12 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
             }
 
             if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
-                if (handle_signals(runtime) != 0) {
+                if (handle_signals(tstate) != 0) {
                     goto error;
                 }
             }
             if (_Py_atomic_load_relaxed(&ceval->pending.calls_to_do)) {
-                if (make_pending_calls(runtime) != 0) {
+                if (make_pending_calls(tstate) != 0) {
                     goto error;
                 }
             }



More information about the Python-checkins mailing list