Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 15 additions & 11 deletions Python/ceval.c
Original file line number Diff line number Diff line change
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