diff options
author | Benjamin Peterson <benjamin@python.org> | 2008-06-13 00:09:47 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2008-06-13 00:09:47 (GMT) |
commit | 114f7e5ffff86daef0a9e9802317e7b259c447f9 (patch) | |
tree | e8ccddec529ca7299c3bbe37e21df40f572696cc /Python | |
parent | 26305a03e3d501f9338af3f1373f8ec7da88838f (diff) | |
download | cpython-114f7e5ffff86daef0a9e9802317e7b259c447f9.zip cpython-114f7e5ffff86daef0a9e9802317e7b259c447f9.tar.gz cpython-114f7e5ffff86daef0a9e9802317e7b259c447f9.tar.bz2 |
#1683 prevent forking from interfering in threading storage
This should prevent some test_multiprocessing failures
Diffstat (limited to 'Python')
-rw-r--r-- | Python/thread.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/Python/thread.c b/Python/thread.c index 9a4dc25..b21e53b 100644 --- a/Python/thread.c +++ b/Python/thread.c @@ -381,4 +381,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 */ |