summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2018-10-03 12:11:43 +0200
committerAnatol Belski <ab@php.net>2018-10-03 12:11:43 +0200
commitb0547a3dfba6702e7cc94476d4d422374c20b4b8 (patch)
tree2b6e689c1519523b4778f41d723908796fb4a497
parent945f315506538208705d370f39a6896371e48ebb (diff)
downloadphp-git-b0547a3dfba6702e7cc94476d4d422374c20b4b8.tar.gz
Fixed bug #76948 Failed shutdown/reboot or end session in Windows
-rw-r--r--sapi/cgi/cgi_main.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c
index b0f1c1b601..d571cf02d4 100644
--- a/sapi/cgi/cgi_main.c
+++ b/sapi/cgi/cgi_main.c
@@ -226,9 +226,10 @@ static php_cgi_globals_struct php_cgi_globals;
#ifdef PHP_WIN32
#define WIN32_MAX_SPAWN_CHILDREN 64
HANDLE kid_cgi_ps[WIN32_MAX_SPAWN_CHILDREN];
-int kids;
+int kids, cleaning_up = 0;
HANDLE job = NULL;
JOBOBJECT_EXTENDED_LIMIT_INFORMATION job_info = { 0 };
+CRITICAL_SECTION cleanup_lock;
#endif
#ifndef HAVE_ATTRIBUTE_WEAK
@@ -1492,6 +1493,10 @@ BOOL WINAPI fastcgi_cleanup(DWORD sig)
{
int i = kids;
+ EnterCriticalSection(&cleanup_lock);
+ cleaning_up = 1;
+ LeaveCriticalSection(&cleanup_lock);
+
while (0 < i--) {
if (NULL == kid_cgi_ps[i]) {
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));
kids = children < WIN32_MAX_SPAWN_CHILDREN ? children : WIN32_MAX_SPAWN_CHILDREN;
+ InitializeCriticalSection(&cleanup_lock);
SetConsoleCtrlHandler(fastcgi_cleanup, TRUE);
/* 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) {
+ EnterCriticalSection(&cleanup_lock);
+ if (cleaning_up) {
+ DeleteCriticalSection(&cleanup_lock);
+ goto parent_out;
+ }
+ LeaveCriticalSection(&cleanup_lock);
+
i = kids;
while (0 < i--) {
DWORD status;
@@ -2289,6 +2302,8 @@ consult the installation file that came with this distribution, or visit \n\
/* restore my env */
SetEnvironmentVariable("PHP_FCGI_CHILDREN", kid_buf);
+ DeleteCriticalSection(&cleanup_lock);
+
goto parent_out;
} else {
parent = 0;