From 839184f85cb2d2ad514fff9b431733d1c9607533 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 19 Feb 2021 15:51:36 +0100 Subject: bpo-43268: local_clear() uses _PyInterpreterState_GET() (GH-24583) Cleanup also the code. --- Modules/_threadmodule.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 9b87577..f6217e6 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -828,27 +828,26 @@ local_traverse(localobject *self, visitproc visit, void *arg) static int local_clear(localobject *self) { - PyThreadState *tstate; Py_CLEAR(self->args); Py_CLEAR(self->kw); Py_CLEAR(self->dummies); Py_CLEAR(self->wr_callback); /* Remove all strong references to dummies from the thread states */ - if (self->key - && (tstate = PyThreadState_Get()) - && tstate->interp) { - for(tstate = PyInterpreterState_ThreadHead(tstate->interp); - tstate; - tstate = PyThreadState_Next(tstate)) - if (tstate->dict) { - PyObject *v = _PyDict_Pop(tstate->dict, self->key, Py_None); - if (v == NULL) { - PyErr_Clear(); - } - else { - Py_DECREF(v); - } + if (self->key) { + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyThreadState *tstate = PyInterpreterState_ThreadHead(interp); + for(; tstate; tstate = PyThreadState_Next(tstate)) { + if (tstate->dict == NULL) { + continue; } + PyObject *v = _PyDict_Pop(tstate->dict, self->key, Py_None); + if (v != NULL) { + Py_DECREF(v); + } + else { + PyErr_Clear(); + } + } } return 0; } -- cgit v0.12