From: Jérôme Loyet Date: Sat, 18 Jun 2011 16:15:15 +0000 (+0000) Subject: Fixed exit at FPM startup on fpm_resources_prepare X-Git-Tag: php-5.3.7RC2~36 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e1f77ef6b2108138a9e541d1bfe66a29b80e426;p=php Fixed exit at FPM startup on fpm_resources_prepare --- diff --git a/NEWS b/NEWS index 27301f467b..78f7bd7bd0 100644 --- a/NEWS +++ b/NEWS @@ -174,6 +174,7 @@ PHP NEWS - PHP-FPM SAPI: . Added xml format to the status page. (fat) . Remove timestamp in logs written by children processes. (fat) + . Fixed exit at FPM startup on fpm_resources_prepare() errors. (fat) - Reflection extension: . Fixed bug #54347 (reflection_extension does not lowercase module function diff --git a/sapi/fpm/fpm/fpm.c b/sapi/fpm/fpm/fpm.c index 0cfaabd414..e3fa3e3bd6 100644 --- a/sapi/fpm/fpm/fpm.c +++ b/sapi/fpm/fpm/fpm.c @@ -90,10 +90,16 @@ int fpm_run(int *max_requests) /* {{{ */ if (!is_parent) { goto run_child; } + + /* handle error */ + if (is_parent == 2) { + fpm_pctl(FPM_PCTL_STATE_TERMINATING, FPM_PCTL_ACTION_SET); + fpm_event_loop(1); + } } /* run event loop forever */ - fpm_event_loop(); + fpm_event_loop(0); run_child: /* only workers reach this point */ diff --git a/sapi/fpm/fpm/fpm_children.c b/sapi/fpm/fpm/fpm_children.c index 499ad08e8f..476d5523de 100644 --- a/sapi/fpm/fpm/fpm_children.c +++ b/sapi/fpm/fpm/fpm_children.c @@ -350,7 +350,6 @@ static void fpm_parent_resources_use(struct fpm_child_s *child) /* {{{ */ int fpm_children_make(struct fpm_worker_pool_s *wp, int in_event_loop, int nb_to_spawn, int is_debug) /* {{{ */ { - int enough = 0; pid_t pid; struct fpm_child_s *child; int max; @@ -365,12 +364,11 @@ int fpm_children_make(struct fpm_worker_pool_s *wp, int in_event_loop, int nb_to max = wp->config->pm_max_children; } - while (!enough && fpm_pctl_can_spawn_children() && wp->running_children < max) { + while (fpm_pctl_can_spawn_children() && wp->running_children < max) { child = fpm_resources_prepare(wp); if (!child) { - enough = 1; - break; + return 2; } pid = fork(); @@ -385,11 +383,9 @@ int fpm_children_make(struct fpm_worker_pool_s *wp, int in_event_loop, int nb_to case -1 : zlog(ZLOG_SYSERROR, "fork() failed"); - enough = 1; fpm_resources_discard(child); - - break; /* dont try any more on error */ + return 2; default : child->pid = pid; diff --git a/sapi/fpm/fpm/fpm_events.c b/sapi/fpm/fpm/fpm_events.c index 66ff393e2f..2bb4b94c00 100644 --- a/sapi/fpm/fpm/fpm_events.c +++ b/sapi/fpm/fpm/fpm_events.c @@ -235,7 +235,7 @@ int fpm_event_init_main() /* {{{ */ } /* }}} */ -void fpm_event_loop() /* {{{ */ +void fpm_event_loop(int err) /* {{{ */ { static struct fpm_event_s signal_fd_event; @@ -249,9 +249,12 @@ void fpm_event_loop() /* {{{ */ /* add timers */ fpm_pctl_heartbeat(NULL, 0, NULL); - fpm_pctl_perform_idle_server_maintenance_heartbeat(NULL, 0, NULL); - zlog(ZLOG_NOTICE, "ready to handle connections"); + if (!err) { + fpm_pctl_perform_idle_server_maintenance_heartbeat(NULL, 0, NULL); + + zlog(ZLOG_NOTICE, "ready to handle connections"); + } while (1) { struct fpm_event_queue_s *q, *q2; diff --git a/sapi/fpm/fpm/fpm_events.h b/sapi/fpm/fpm/fpm_events.h index bec13ba5e7..586b242835 100644 --- a/sapi/fpm/fpm/fpm_events.h +++ b/sapi/fpm/fpm/fpm_events.h @@ -22,7 +22,7 @@ struct fpm_event_s { short which; /* type of event */ }; -void fpm_event_loop(); +void fpm_event_loop(int err); void fpm_event_fire(struct fpm_event_s *ev); int fpm_event_init_main(); int fpm_event_set(struct fpm_event_s *ev, int fd, int flags, void (*callback)(struct fpm_event_s *, short, void *), void *arg);