diff -ur cpython-5e87dd117f74/Include/pystate.h cpython/Include/pystate.h --- cpython-5e87dd117f74/Include/pystate.h 2011-04-12 00:57:21.000000000 +0000 +++ cpython/Include/pystate.h 2011-04-27 15:53:09.000000000 +0000 @@ -131,6 +131,7 @@ PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *); #ifdef WITH_THREAD PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void); +PyAPI_FUNC(void) _PyGILState_Reinit(void); #endif PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void); diff -ur cpython-5e87dd117f74/Modules/signalmodule.c cpython/Modules/signalmodule.c --- cpython-5e87dd117f74/Modules/signalmodule.c 2011-04-12 00:57:21.000000000 +0000 +++ cpython/Modules/signalmodule.c 2011-04-27 15:54:55.000000000 +0000 @@ -985,6 +985,7 @@ PyOS_AfterFork(void) { #ifdef WITH_THREAD + _PyGILState_Reinit(); PyEval_ReInitThreads(); main_thread = PyThread_get_thread_ident(); main_pid = getpid(); diff -ur cpython-5e87dd117f74/Python/pystate.c cpython/Python/pystate.c --- cpython-5e87dd117f74/Python/pystate.c 2011-04-12 00:57:21.000000000 +0000 +++ cpython/Python/pystate.c 2011-04-27 15:51:46.000000000 +0000 @@ -585,6 +585,23 @@ autoInterpreterState = NULL; } +/* Reset the TLS key - called by PyOS_AfterFork. + * This should not be necessary, but some - buggy - pthread implementations + * don't flush TLS on fork, see issue #10517. + */ +void +_PyGILState_Reinit(void) +{ + PyThreadState *tstate = PyGILState_GetThisThreadState(); + PyThread_delete_key(autoTLSkey); + if ((autoTLSkey = PyThread_create_key()) == -1) + Py_FatalError("Could not allocate TLS entry"); + + /* re-associate the current thread state with the new key */ + if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0) + Py_FatalError("Couldn't create autoTLSkey mapping"); +} + /* When a thread state is created for a thread by some mechanism other than PyGILState_Ensure, it's important that the GILState machinery knows about it so it doesn't try to create another thread state for the thread (this is