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

handle_signals() and make_pending_calls() now expect tstate rather
than runtime.
This commit is contained in:
Victor Stinner 2020-03-18 01:56:21 +01:00 committed by GitHub
parent 2fe815edd6
commit d7fabc1162
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View 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;
}
}