Backport of r65032 from trunk

Fixes Issue #874900: after an os.fork() call the threading module state is cleaned
up in the child process to prevent deadlock and report proper thread counts
if the new process uses the threading module.
This commit is contained in:
Gregory P. Smith 2008-08-17 23:01:11 +00:00
parent 1d63a45d0d
commit 5e8dc97a09
4 changed files with 136 additions and 1 deletions

View file

@ -272,6 +272,9 @@ PyEval_ReleaseThread(PyThreadState *tstate)
void
PyEval_ReInitThreads(void)
{
PyObject *threading, *result;
PyThreadState *tstate;
if (!interpreter_lock)
return;
/*XXX Can't use PyThread_free_lock here because it does too
@ -281,6 +284,23 @@ PyEval_ReInitThreads(void)
interpreter_lock = PyThread_allocate_lock();
PyThread_acquire_lock(interpreter_lock, 1);
main_thread = PyThread_get_thread_ident();
/* Update the threading module with the new state.
*/
tstate = PyThreadState_GET();
threading = PyMapping_GetItemString(tstate->interp->modules,
"threading");
if (threading == NULL) {
/* threading not imported */
PyErr_Clear();
return;
}
result = PyObject_CallMethod(threading, "_after_fork", NULL);
if (result == NULL)
PyErr_WriteUnraisable(threading);
else
Py_DECREF(result);
Py_DECREF(threading);
}
#endif