--- thread.c 2008-01-05 18:18:54.000000000 +0000 +++ Python-2.5.1/Python/thread.c 2008-01-05 18:35:38.000000000 +0000 @@ -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 */ --- signalmodule.c 2008-01-05 18:19:06.000000000 +0000 +++ Python-2.5.1/Modules/signalmodule.c 2008-01-06 12:24:40.000000000 +0000 @@ -672,5 +672,6 @@ main_thread = PyThread_get_thread_ident(); main_pid = getpid(); _PyImport_ReInitLock(); + PyThread_ReInitTLS(); #endif } --- intrcheck.c 2008-01-05 20:43:33.000000000 +0000 +++ Python-2.5.1/Parser/intrcheck.c 2008-01-05 20:51:45.000000000 +0000 @@ -172,5 +172,6 @@ { #ifdef WITH_THREAD PyEval_ReInitThreads(); + PyThread_ReInitTLS(); #endif }