Commit 8a64048a authored by Martin v. Löwis's avatar Martin v. Löwis

Backport of r64212

Issue #1683: prevent forking from interfering in threading storage.
parent e9859df7
......@@ -40,6 +40,9 @@ PyAPI_FUNC(int) PyThread_set_key_value(int, void *);
PyAPI_FUNC(void *) PyThread_get_key_value(int);
PyAPI_FUNC(void) PyThread_delete_key_value(int key);
/* Cleanup after a fork */
PyAPI_FUNC(void) PyThread_ReInitTLS(void);
#ifdef __cplusplus
}
#endif
......
......@@ -12,6 +12,8 @@ What's New in Python 2.5.3?
Core and builtins
-----------------
- Issue #1683: prevent forking from interfering in threading storage.
- Issue #4597: Fixed several opcodes that weren't always propagating
exceptions.
......
......@@ -693,5 +693,6 @@ PyOS_AfterFork(void)
main_thread = PyThread_get_thread_ident();
main_pid = getpid();
_PyImport_ReInitLock();
PyThread_ReInitTLS();
#endif
}
......@@ -2,6 +2,7 @@
/* Check for interrupts */
#include "Python.h"
#include "pythread.h"
#ifdef QUICKWIN
......@@ -172,5 +173,6 @@ PyOS_AfterFork(void)
{
#ifdef WITH_THREAD
PyEval_ReInitThreads();
PyThread_ReInitTLS();
#endif
}
......@@ -391,4 +391,35 @@ PyThread_delete_key_value(int key)
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 */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment