summaryrefslogtreecommitdiffstats
path: root/Modules/_threadmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/_threadmodule.c')
-rw-r--r--Modules/_threadmodule.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c
index d323ca8..4fbf0e5 100644
--- a/Modules/_threadmodule.c
+++ b/Modules/_threadmodule.c
@@ -839,6 +839,11 @@ local_traverse(localobject *self, visitproc visit, void *arg)
return 0;
}
+#define HEAD_LOCK(runtime) \
+ PyThread_acquire_lock((runtime)->interpreters.mutex, WAIT_LOCK)
+#define HEAD_UNLOCK(runtime) \
+ PyThread_release_lock((runtime)->interpreters.mutex)
+
static int
local_clear(localobject *self)
{
@@ -849,18 +854,23 @@ local_clear(localobject *self)
/* Remove all strong references to dummies from the thread states */
if (self->key) {
PyInterpreterState *interp = _PyInterpreterState_GET();
+ _PyRuntimeState *runtime = &_PyRuntime;
+ HEAD_LOCK(runtime);
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();
+ HEAD_UNLOCK(runtime);
+ while (tstate) {
+ if (tstate->dict) {
+ PyObject *v = _PyDict_Pop(tstate->dict, self->key, Py_None);
+ if (v != NULL) {
+ Py_DECREF(v);
+ }
+ else {
+ PyErr_Clear();
+ }
}
+ HEAD_LOCK(runtime);
+ tstate = PyThreadState_Next(tstate);
+ HEAD_UNLOCK(runtime);
}
}
return 0;