dmitry Tue Jul 15 13:11:19 2008 UTC
Modified files: (Branch: PHP_5_3)
/php-src/sapi/cgi cgi_main.c fastcgi.c
Log:
Fixed bug #45423 (fastcgi parent process doesn't invoke php_module_shutdown
before shutdown) (basant dot kukreja at sun dot com)
http://cvs.php.net/viewvc.cgi/php-src/sapi/cgi/cgi_main.c?r1=1.267.2.15.2.50.2.19&r2=1.267.2.15.2.50.2.20&diff_format=u
Index: php-src/sapi/cgi/cgi_main.c
diff -u php-src/sapi/cgi/cgi_main.c:1.267.2.15.2.50.2.19
php-src/sapi/cgi/cgi_main.c:1.267.2.15.2.50.2.20
--- php-src/sapi/cgi/cgi_main.c:1.267.2.15.2.50.2.19 Mon Jun 23 11:37:50 2008
+++ php-src/sapi/cgi/cgi_main.c Tue Jul 15 13:11:19 2008
@@ -21,7 +21,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: cgi_main.c,v 1.267.2.15.2.50.2.19 2008/06/23 11:37:50 dmitry Exp $ */
+/* $Id: cgi_main.c,v 1.267.2.15.2.50.2.20 2008/07/15 13:11:19 dmitry Exp $ */
#include "php.h"
#include "php_globals.h"
@@ -101,6 +101,12 @@
*/
static int parent = 1;
+/* Did parent received exit signals SIG_TERM/SIG_INT/SIG_QUIT */
+static int exit_signal = 0;
+
+/* Is Parent waiting for children to exit */
+static int parent_waiting = 0;
+
/**
* Process group
*/
@@ -1225,6 +1231,7 @@
}
/* }}} */
+#ifndef PHP_WIN32
/**
* Clean up child processes upon exit
*/
@@ -1234,16 +1241,18 @@
fprintf(stderr, "FastCGI shutdown, pid %d\n", getpid());
#endif
-#ifndef PHP_WIN32
sigaction(SIGTERM, &old_term, 0);
/* Kill all the processes in our process group */
kill(-pgroup, SIGTERM);
-#endif
- /* We should exit at this point, but MacOSX doesn't seem to */
- exit(0);
+ if (parent && parent_waiting) {
+ exit_signal = 1;
+ } else {
+ exit(0);
+ }
}
+#endif
PHP_INI_BEGIN()
STD_PHP_INI_ENTRY("cgi.rfc2616_headers", "0", PHP_INI_ALL,
OnUpdateBool, rfc2616_headers, php_cgi_globals_struct, php_cgi_globals)
@@ -1585,7 +1594,7 @@
}
if (fcgi_in_shutdown()) {
- exit(0);
+ goto parent_out;
}
while (parent) {
@@ -1622,9 +1631,25 @@
#ifdef DEBUG_FASTCGI
fprintf(stderr, "Wait for kids, pid %d\n",
getpid());
#endif
- while (wait(&status) < 0) {
+ parent_waiting = 1;
+ while (1) {
+ if (wait(&status) >= 0) {
+ running--;
+ break;
+ } else if (exit_signal) {
+ break;
+ }
+ }
+ if (exit_signal) {
+#if 0
+ while (running > 0) {
+ while (wait(&status) < 0) {
+ }
+ running--;
+ }
+#endif
+ goto parent_out;
}
- running--;
}
}
} else {
@@ -2092,6 +2117,10 @@
#endif
}
+#ifndef PHP_WIN32
+parent_out:
+#endif
+
SG(server_context) = NULL;
php_module_shutdown(TSRMLS_C);
sapi_shutdown();
http://cvs.php.net/viewvc.cgi/php-src/sapi/cgi/fastcgi.c?r1=1.4.2.13.2.28.2.3&r2=1.4.2.13.2.28.2.4&diff_format=u
Index: php-src/sapi/cgi/fastcgi.c
diff -u php-src/sapi/cgi/fastcgi.c:1.4.2.13.2.28.2.3
php-src/sapi/cgi/fastcgi.c:1.4.2.13.2.28.2.4
--- php-src/sapi/cgi/fastcgi.c:1.4.2.13.2.28.2.3 Thu Apr 3 10:24:58 2008
+++ php-src/sapi/cgi/fastcgi.c Tue Jul 15 13:11:19 2008
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: fastcgi.c,v 1.4.2.13.2.28.2.3 2008/04/03 10:24:58 dmitry Exp $ */
+/* $Id: fastcgi.c,v 1.4.2.13.2.28.2.4 2008/07/15 13:11:19 dmitry Exp $ */
#include "php.h"
#include "fastcgi.h"
@@ -170,6 +170,20 @@
}
}
+static void fcgi_setup_signals(void)
+{
+ struct sigaction new_sa, old_sa;
+
+ sigemptyset(&new_sa.sa_mask);
+ new_sa.sa_flags = 0;
+ new_sa.sa_handler = fcgi_signal_handler;
+ sigaction(SIGUSR1, &new_sa, NULL);
+ sigaction(SIGTERM, &new_sa, NULL);
+ sigaction(SIGPIPE, NULL, &old_sa);
+ if (old_sa.sa_handler == SIG_DFL) {
+ sigaction(SIGPIPE, &new_sa, NULL);
+ }
+}
#endif
int fcgi_in_shutdown(void)
@@ -224,18 +238,7 @@
is_initialized = 1;
errno = 0;
if (getpeername(0, (struct sockaddr *)&sa, &len) != 0 && errno
== ENOTCONN) {
- struct sigaction new_sa, old_sa;
-
- sigemptyset(&new_sa.sa_mask);
- new_sa.sa_flags = 0;
- new_sa.sa_handler = fcgi_signal_handler;
- sigaction(SIGUSR1, &new_sa, NULL);
- sigaction(SIGTERM, &new_sa, NULL);
- sigaction(SIGPIPE, NULL, &old_sa);
- if (old_sa.sa_handler == SIG_DFL) {
- sigaction(SIGPIPE, &new_sa, NULL);
- }
-
+ fcgi_setup_signals();
return is_fastcgi = 1;
} else {
return is_fastcgi = 0;
@@ -501,6 +504,8 @@
if (tcp) {
listen_socket = _open_osfhandle((long)listen_socket, 0);
}
+#else
+ fcgi_setup_signals();
#endif
return listen_socket;
}
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php