26static int fpm_signal_sent = 0;
29static const char *fpm_state_names[] = {
37static char **saved_argv;
39static void fpm_pctl_cleanup(
int which,
void *
arg)
43 for (i = 0; i < saved_argc; i++) {
59static int fpm_pctl_timeout_set(
int sec)
67static void fpm_pctl_exit(
void)
76#define optional_arg(c) (saved_argc > c ? ", \"" : ""), (saved_argc > c ? saved_argv[c] : ""), (saved_argc > c ? "\"" : "")
78static void fpm_pctl_exec(
void)
86 "%s%s%s" "%s%s%s" "%s%s%s" "%s%s%s" "%s%s%s"
87 "%s%s%s" "%s%s%s" "%s%s%s" "%s%s%s" "%s%s%s"
89 saved_argv[0], saved_argv[0],
106 execvp(saved_argv[0], saved_argv);
111static void fpm_pctl_action_last(
void)
155 int alive_children = 0;
161 int res = kill(child->
pid, signo);
173 if (alive_children) {
179static void fpm_pctl_action_next(
void)
184 fpm_pctl_action_last();
187 if (fpm_signal_sent == 0) {
195 if (fpm_signal_sent ==
SIGQUIT) {
204 fpm_signal_sent = sig;
205 fpm_pctl_timeout_set(timeout);
212 if (fpm_state == new_state) {
230 zlog(
ZLOG_DEBUG,
"not switching to '%s' state, because already in '%s' state",
231 fpm_state_names[new_state], fpm_state_names[fpm_state]);
237 fpm_state = new_state;
239 zlog(
ZLOG_DEBUG,
"switching to '%s' state", fpm_state_names[fpm_state]);
243 fpm_pctl_action_next();
246 fpm_pctl_action_last();
275 saved_argv = malloc(
sizeof(
char *) * (saved_argc + 1));
281 for (i = 0; i < saved_argc; i++) {
284 if (!saved_argv[i]) {
297static void fpm_pctl_check_request_timeout(
struct timeval *
now)
307 if (terminate_timeout || slowlog_timeout) {
316static void fpm_pctl_kill_idle_child(
struct fpm_child_s *child)
327static void fpm_pctl_perform_idle_server_maintenance(
struct timeval *
now)
336 int children_to_fork;
363 if (last_idle_child ==
NULL) {
364 last_idle_child = child;
367 last_idle_child = child;
384 if (!last_idle_child)
continue;
389 fpm_pctl_kill_idle_child(last_idle_child);
401 fpm_pctl_kill_idle_child(last_idle_child);
406 if (idle < wp->config->pm_min_spare_servers) {
426 if (children_to_fork <= 0) {
470 fpm_pctl_check_request_timeout(&
now);
496 fpm_pctl_perform_idle_server_maintenance(&
now);
struct fpm_globals_s fpm_globals
#define FPM_EXIT_SOFTWARE
int fpm_children_make(struct fpm_worker_pool_s *wp, int in_event_loop, int nb_to_spawn, int is_debug)
int fpm_cleanup_add(int type, void(*cleanup)(int, void *), void *arg)
void fpm_cleanups_run(int type)
@ FPM_CLEANUP_PARENT_EXEC
@ FPM_CLEANUP_PARENT_EXIT_MAIN
int fpm_clock_get(struct timeval *tv)
int fpm_conf_unlink_pid(void)
struct fpm_global_config_s fpm_global_config
#define timercmp(a, b, CMP)
int fpm_event_add(struct fpm_event_s *ev, unsigned long int frequency)
#define fpm_event_set_timer(ev, flags, cb, arg)
void fpm_pctl(int new_state, int action)
int fpm_pctl_init_main(void)
int fpm_pctl_can_spawn_children(void)
int fpm_pctl_kill(pid_t pid, int how)
void fpm_pctl_on_socket_accept(struct fpm_event_s *ev, short which, void *arg)
void fpm_pctl_heartbeat(struct fpm_event_s *ev, short which, void *arg)
void fpm_pctl_kill_all(int signo)
int fpm_pctl_child_exited(void)
void fpm_pctl_perform_idle_server_maintenance_heartbeat(struct fpm_event_s *ev, short which, void *arg)
@ FPM_PCTL_STATE_TERMINATING
@ FPM_PCTL_STATE_FINISHING
@ FPM_PCTL_STATE_RELOADING
@ FPM_PCTL_STATE_UNSPECIFIED
@ FPM_PCTL_ACTION_TIMEOUT
@ FPM_PCTL_ACTION_LAST_CHILD_EXITED
#define FPM_IDLE_SERVER_MAINTENANCE_HEARTBEAT
#define FPM_PCTL_MIN_HEARTBEAT
void fpm_request_check_timed_out(struct fpm_child_s *child, struct timeval *now, int terminate_timeout, int slowlog_timeout, int track_finished)
int fpm_request_last_activity(struct fpm_child_s *child, struct timeval *tv)
int fpm_request_is_idle(struct fpm_child_s *child)
void fpm_scoreboard_update_begin(struct fpm_scoreboard_s *scoreboard)
void fpm_scoreboard_update_commit(int idle, int active, int lq, int lq_len, int requests, int max_children_reached, int slow_rq, size_t memory_peak, int action, struct fpm_scoreboard_s *scoreboard)
void fpm_scoreboard_update(int idle, int active, int lq, int lq_len, int requests, int max_children_reached, int slow_rq, size_t memory_peak, int action, struct fpm_scoreboard_s *scoreboard)
#define FPM_SCOREBOARD_ACTION_INC
#define FPM_SCOREBOARD_ACTION_SET
const char * fpm_signal_names[NSIG+1]
int fpm_signals_block(void)
int fpm_socket_get_listening_queue(int sock, unsigned *cur_lq, unsigned *max_lq)
int fpm_stdio_restore_original_stderr(int close_after_restore)
struct fpm_worker_pool_s * fpm_worker_all_pools
php_output_handler * active
struct fpm_child_s * next
struct fpm_worker_pool_s * wp
int request_terminate_timeout_track_finished
int request_slowlog_timeout
int pm_process_idle_timeout
int request_terminate_timeout
struct fpm_worker_pool_config_s * config
enum fpm_address_domain listen_address_domain
struct fpm_worker_pool_s * shared
struct fpm_scoreboard_s * scoreboard
struct fpm_worker_pool_s * next
struct fpm_child_s * children
exit(string|int $status=0)