]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39984: Pass tstate to handle_signals() (GH-19050)
authorVictor Stinner <vstinner@python.org>
Wed, 18 Mar 2020 00:56:21 +0000 (01:56 +0100)
committerGitHub <noreply@github.com>
Wed, 18 Mar 2020 00:56:21 +0000 (01:56 +0100)
handle_signals() and make_pending_calls() now expect tstate rather
than runtime.

Python/ceval.c

index 8835c3eb3f9214014e90feb33f93322285d128ff..b055d61c08412bc64f59a9a52fc41a69c39e805f 100644 (file)
@@ -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 @@ main_loop:
             }
 
             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;
                 }
             }