summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2020-03-18 00:56:21 (GMT)
committerGitHub <noreply@github.com>2020-03-18 00:56:21 (GMT)
commitd7fabc116269e4650a684eb04f9ecd84421aa247 (patch)
treef2473893a4e4a2a7443957302c3f97f791891cba
parent2fe815edd6778fb9deef8f8044848647659c2eb8 (diff)
downloadcpython-d7fabc116269e4650a684eb04f9ecd84421aa247.zip
cpython-d7fabc116269e4650a684eb04f9ecd84421aa247.tar.gz
cpython-d7fabc116269e4650a684eb04f9ecd84421aa247.tar.bz2
bpo-39984: Pass tstate to handle_signals() (GH-19050)
handle_signals() and make_pending_calls() now expect tstate rather than runtime.
-rw-r--r--Python/ceval.c26
1 files changed, 15 insertions, 11 deletions
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 @@ 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;
}
}