[3.6] bpo-30395 _PyGILState_Reinit deadlock fix (GH-1734) (#1740)

head_lock could be held by another thread when fork happened. We should
reset it to avoid deadlock.
(cherry picked from commit f82c951d1c)
This commit is contained in:
Łukasz Langa 2017-05-22 22:23:05 -07:00 committed by GitHub
parent 1398b1bc7d
commit d29feccec3
2 changed files with 5 additions and 0 deletions

View file

@ -552,6 +552,7 @@ Eric Groo
Daniel Andrade Groppe Daniel Andrade Groppe
Dag Gruneau Dag Gruneau
Filip Gruszczyński Filip Gruszczyński
Andrii Grynenko
Grzegorz Grzywacz Grzegorz Grzywacz
Thomas Guettler Thomas Guettler
Yuyang Guo Yuyang Guo

View file

@ -743,6 +743,10 @@ _PyGILState_Fini(void)
void void
_PyGILState_Reinit(void) _PyGILState_Reinit(void)
{ {
#ifdef WITH_THREAD
head_mutex = NULL;
HEAD_INIT();
#endif
PyThreadState *tstate = PyGILState_GetThisThreadState(); PyThreadState *tstate = PyGILState_GetThisThreadState();
PyThread_delete_key(autoTLSkey); PyThread_delete_key(autoTLSkey);
if ((autoTLSkey = PyThread_create_key()) == -1) if ((autoTLSkey = PyThread_create_key()) == -1)