Fixed bug #76948 Failed shutdown/reboot or end session in Windows

This commit is contained in:
Anatol Belski 2018-10-03 12:11:43 +02:00
parent 945f315506
commit b0547a3dfb

View file

@ -226,9 +226,10 @@ static php_cgi_globals_struct php_cgi_globals;
#ifdef PHP_WIN32 #ifdef PHP_WIN32
#define WIN32_MAX_SPAWN_CHILDREN 64 #define WIN32_MAX_SPAWN_CHILDREN 64
HANDLE kid_cgi_ps[WIN32_MAX_SPAWN_CHILDREN]; HANDLE kid_cgi_ps[WIN32_MAX_SPAWN_CHILDREN];
int kids; int kids, cleaning_up = 0;
HANDLE job = NULL; HANDLE job = NULL;
JOBOBJECT_EXTENDED_LIMIT_INFORMATION job_info = { 0 }; JOBOBJECT_EXTENDED_LIMIT_INFORMATION job_info = { 0 };
CRITICAL_SECTION cleanup_lock;
#endif #endif
#ifndef HAVE_ATTRIBUTE_WEAK #ifndef HAVE_ATTRIBUTE_WEAK
@ -1492,6 +1493,10 @@ BOOL WINAPI fastcgi_cleanup(DWORD sig)
{ {
int i = kids; int i = kids;
EnterCriticalSection(&cleanup_lock);
cleaning_up = 1;
LeaveCriticalSection(&cleanup_lock);
while (0 < i--) { while (0 < i--) {
if (NULL == kid_cgi_ps[i]) { if (NULL == kid_cgi_ps[i]) {
continue; continue;
@ -2186,6 +2191,7 @@ consult the installation file that came with this distribution, or visit \n\
ZeroMemory(&kid_cgi_ps, sizeof(kid_cgi_ps)); ZeroMemory(&kid_cgi_ps, sizeof(kid_cgi_ps));
kids = children < WIN32_MAX_SPAWN_CHILDREN ? children : WIN32_MAX_SPAWN_CHILDREN; kids = children < WIN32_MAX_SPAWN_CHILDREN ? children : WIN32_MAX_SPAWN_CHILDREN;
InitializeCriticalSection(&cleanup_lock);
SetConsoleCtrlHandler(fastcgi_cleanup, TRUE); SetConsoleCtrlHandler(fastcgi_cleanup, TRUE);
/* kids will inherit the env, don't let them spawn */ /* kids will inherit the env, don't let them spawn */
@ -2234,6 +2240,13 @@ consult the installation file that came with this distribution, or visit \n\
} }
while (parent) { while (parent) {
EnterCriticalSection(&cleanup_lock);
if (cleaning_up) {
DeleteCriticalSection(&cleanup_lock);
goto parent_out;
}
LeaveCriticalSection(&cleanup_lock);
i = kids; i = kids;
while (0 < i--) { while (0 < i--) {
DWORD status; DWORD status;
@ -2289,6 +2302,8 @@ consult the installation file that came with this distribution, or visit \n\
/* restore my env */ /* restore my env */
SetEnvironmentVariable("PHP_FCGI_CHILDREN", kid_buf); SetEnvironmentVariable("PHP_FCGI_CHILDREN", kid_buf);
DeleteCriticalSection(&cleanup_lock);
goto parent_out; goto parent_out;
} else { } else {
parent = 0; parent = 0;