mirror of
https://github.com/python/cpython.git
synced 2025-08-20 00:32:12 +00:00
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:
parent
1d63a45d0d
commit
5e8dc97a09
4 changed files with 136 additions and 1 deletions
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue