diff options
author | Victor Stinner <vstinner@python.org> | 2020-03-18 00:56:21 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-18 00:56:21 (GMT) |
commit | d7fabc116269e4650a684eb04f9ecd84421aa247 (patch) | |
tree | f2473893a4e4a2a7443957302c3f97f791891cba | |
parent | 2fe815edd6778fb9deef8f8044848647659c2eb8 (diff) | |
download | cpython-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.c | 26 |
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; } } |