Mercurial > cpython-lru_cache-weakref
comparison Modules/threadmodule.c @ 47869:e8bee3097d44 2.5
#Issue3088 in-progress: Race condition with instances of classes derived from threading.local:
When a thread touches such an object for the first time, a new thread-local __dict__ is created,
and the __init__ method is run.
But a thread switch can occur here; if the other thread touches the same object, it installs another
__dict__; when the first thread resumes, it updates the dictionary of the second...
This is the deep cause of the failures in test_multiprocessing involving "managers" objects.
Backport of r64601.
| author | Amaury Forgeot d'Arc <amauryfa@gmail.com> |
|---|---|
| date | Tue, 01 Jul 2008 20:59:49 +0000 |
| parents | a1863833c4e6 |
| children | edd9a5e3cafb |
comparison
equal
deleted
inserted
replaced
| 47867:60fd0886811c | 47869:e8bee3097d44 |
|---|---|
| 292 PyDict_DelItem(tdict, self->key); | 292 PyDict_DelItem(tdict, self->key); |
| 293 return NULL; | 293 return NULL; |
| 294 } | 294 } |
| 295 | 295 |
| 296 } | 296 } |
| 297 else if (self->dict != ldict) { | 297 |
| 298 /* The call to tp_init above may have caused another thread to run. | |
| 299 Install our ldict again. */ | |
| 300 if (self->dict != ldict) { | |
| 298 Py_CLEAR(self->dict); | 301 Py_CLEAR(self->dict); |
| 299 Py_INCREF(ldict); | 302 Py_INCREF(ldict); |
| 300 self->dict = ldict; | 303 self->dict = ldict; |
| 301 } | 304 } |
| 302 | 305 |
