Skip to content

Commit

Permalink
bpo-39984: Pass tstate to handle_signals() (GH-19050)
Browse files Browse the repository at this point in the history
handle_signals() and make_pending_calls() now expect tstate rather
than runtime.
  • Loading branch information
vstinner committed Mar 18, 2020
1 parent 2fe815e commit d7fabc1
Showing 1 changed file with 15 additions and 11 deletions.
26 changes: 15 additions & 11 deletions Python/ceval.c
Expand Up @@ -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;
Expand All @@ -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;
}
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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();
Expand All @@ -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;
}
Expand Down Expand Up @@ -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;
}
}
Expand Down

0 comments on commit d7fabc1

Please sign in to comment.