bpo-40513: Per-interpreter signals pending (GH-19924) · python/cpython@4e01946

@@ -148,7 +148,7 @@ COMPUTE_EVAL_BREAKER(PyInterpreterState *interp,

148148

{

149149

_Py_atomic_store_relaxed(&ceval2->eval_breaker,

150150

_Py_atomic_load_relaxed(&ceval->gil_drop_request)

151-

| (_Py_atomic_load_relaxed(&ceval->signals_pending)

151+

| (_Py_atomic_load_relaxed(&ceval2->signals_pending)

152152

&& _Py_ThreadCanHandleSignals(interp))

153153

| (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)

154154

&& _Py_ThreadCanHandlePendingCalls())

@@ -201,7 +201,7 @@ SIGNAL_PENDING_SIGNALS(PyInterpreterState *interp)

201201

{

202202

struct _ceval_runtime_state *ceval = &interp->runtime->ceval;

203203

struct _ceval_state *ceval2 = &interp->ceval;

204-

_Py_atomic_store_relaxed(&ceval->signals_pending, 1);

204+

_Py_atomic_store_relaxed(&ceval2->signals_pending, 1);

205205

/* eval_breaker is not set to 1 if thread_can_handle_signals() is false */

206206

COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);

207207

}

@@ -212,7 +212,7 @@ UNSIGNAL_PENDING_SIGNALS(PyInterpreterState *interp)

212212

{

213213

struct _ceval_runtime_state *ceval = &interp->runtime->ceval;

214214

struct _ceval_state *ceval2 = &interp->ceval;

215-

_Py_atomic_store_relaxed(&ceval->signals_pending, 0);

215+

_Py_atomic_store_relaxed(&ceval2->signals_pending, 0);

216216

COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);

217217

}

218218

@@ -830,16 +830,16 @@ eval_frame_handle_pending(PyThreadState *tstate)

830830

{

831831

_PyRuntimeState * const runtime = &_PyRuntime;

832832

struct _ceval_runtime_state *ceval = &runtime->ceval;

833+

struct _ceval_state *ceval2 = &tstate->interp->ceval;

833834834835

/* Pending signals */

835-

if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {

836+

if (_Py_atomic_load_relaxed(&ceval2->signals_pending)) {

836837

if (handle_signals(tstate) != 0) {

837838

return -1;

838839

}

839840

}

840841841842

/* Pending calls */

842-

struct _ceval_state *ceval2 = &tstate->interp->ceval;

843843

if (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)) {

844844

if (make_pending_calls(tstate) != 0) {

845845

return -1;