Mercurial > cpython-lru_cache-weakref
diff Python/thread.c @ 50146:8d902c513ba0 2.5
Backport of r64212
Issue #1683: prevent forking from interfering in threading storage.
| author | Martin v. Löwis <martin@v.loewis.de> |
|---|---|
| date | Sat, 13 Dec 2008 14:59:04 +0000 |
| parents | eefe4450f773 |
| children | 787b969d37f0 |
line wrap: on
line diff
--- a/Python/thread.c Sat Dec 13 14:48:13 2008 +0000 +++ b/Python/thread.c Sat Dec 13 14:59:04 2008 +0000 @@ -391,4 +391,35 @@ PyThread_release_lock(keymutex); } +/* Forget everything not associated with the current thread id. + * This function is called from PyOS_AfterFork(). It is necessary + * because other thread ids which were in use at the time of the fork + * may be reused for new threads created in the forked process. + */ +void +PyThread_ReInitTLS(void) +{ + long id = PyThread_get_thread_ident(); + struct key *p, **q; + + if (!keymutex) + return; + + /* As with interpreter_lock in PyEval_ReInitThreads() + we just create a new lock without freeing the old one */ + keymutex = PyThread_allocate_lock(); + + /* Delete all keys which do not match the current thread id */ + q = &keyhead; + while ((p = *q) != NULL) { + if (p->id != id) { + *q = p->next; + free((void *)p); + /* NB This does *not* free p->value! */ + } + else + q = &p->next; + } +} + #endif /* Py_HAVE_NATIVE_TLS */
