
python-checkins at python
Jun 12, 2008, 5:09 PM
Post #1 of 1
(106 views)
Permalink
|
|
r64212 - in python/trunk: Include/pythread.h Modules/signalmodule.c Parser/intrcheck.c Python/thread.c
|
|
Author: benjamin.peterson Date: Fri Jun 13 02:09:47 2008 New Revision: 64212 Log: #1683 prevent forking from interfering in threading storage This should prevent some test_multiprocessing failures Modified: python/trunk/Include/pythread.h python/trunk/Modules/signalmodule.c python/trunk/Parser/intrcheck.c python/trunk/Python/thread.c Modified: python/trunk/Include/pythread.h ============================================================================== --- python/trunk/Include/pythread.h (original) +++ python/trunk/Include/pythread.h Fri Jun 13 02:09:47 2008 @@ -40,6 +40,9 @@ 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 Modified: python/trunk/Modules/signalmodule.c ============================================================================== --- python/trunk/Modules/signalmodule.c (original) +++ python/trunk/Modules/signalmodule.c Fri Jun 13 02:09:47 2008 @@ -925,5 +925,6 @@ main_thread = PyThread_get_thread_ident(); main_pid = getpid(); _PyImport_ReInitLock(); + PyThread_ReInitTLS(); #endif } Modified: python/trunk/Parser/intrcheck.c ============================================================================== --- python/trunk/Parser/intrcheck.c (original) +++ python/trunk/Parser/intrcheck.c Fri Jun 13 02:09:47 2008 @@ -2,6 +2,7 @@ /* Check for interrupts */ #include "Python.h" +#include "pythread.h" #ifdef QUICKWIN @@ -172,5 +173,6 @@ { #ifdef WITH_THREAD PyEval_ReInitThreads(); + PyThread_ReInitTLS(); #endif } Modified: python/trunk/Python/thread.c ============================================================================== --- python/trunk/Python/thread.c (original) +++ python/trunk/Python/thread.c Fri Jun 13 02:09:47 2008 @@ -381,4 +381,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 */ _______________________________________________ Python-checkins mailing list Python-checkins [at] python http://mail.python.org/mailman/listinfo/python-checkins
|