diff options
author | Anatol Belski <ab@php.net> | 2018-10-03 12:15:15 +0200 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2018-10-03 12:15:15 +0200 |
commit | 46bc0940e711400a134e5c3f25366277496d8c5f (patch) | |
tree | 2443bfcc125c50df69984a142f6cd5807801d585 | |
parent | 9f3ea20320e56481dc8626509ba56348e4eda4d2 (diff) | |
parent | dc48e01a190cbd7396deb293e5ba72858b9a2623 (diff) | |
download | php-git-46bc0940e711400a134e5c3f25366277496d8c5f.tar.gz |
Merge branch 'PHP-7.2' into PHP-7.3
* PHP-7.2:
Fixed bug #76948 Failed shutdown/reboot or end session in Windows
-rw-r--r-- | sapi/cgi/cgi_main.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 71ed2fd98d..9b06853a23 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -228,9 +228,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 @@ -1493,6 +1494,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; @@ -2129,8 +2134,9 @@ consult the installation file that came with this distribution, or visit \n\ int i; 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); /* kids will inherit the env, don't let them spawn */ @@ -2179,6 +2185,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; @@ -2234,6 +2247,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; |