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

handle_signals() and make_pending_calls() now expect tstate rather
than runtime.
diff --git a/Python/ceval.c b/Python/ceval.c
index 8835c3e..b055d61 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -506,8 +506,10 @@
 }
 
 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 @@
      * 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 @@
 }
 
 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 @@
 {
     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 @@
         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 @@
 {
     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 @@
             }
 
             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;
                 }
             }