static struct fpm_child_s *fpm_resources_prepare(struct fpm_worker_pool_s *wp) /* {{{ */ { struct fpm_child_s *c; c = fpm_child_alloc(); if (!c) { zlog(ZLOG_ERROR, "[pool %s] malloc failed", wp->config->name); return 0; } c->wp = wp; c->fd_stdout = -1; c->fd_stderr = -1; if (0 > fpm_stdio_prepare_pipes(c)) { fpm_child_free(c); return 0; } if (0 > fpm_scoreboard_proc_alloc(wp->scoreboard, &c->scoreboard_i)) { fpm_stdio_discard_pipes(c); fpm_child_free(c); return 0; } return c; }
static struct fpm_child_s *fpm_resources_prepare(struct fpm_worker_pool_s *wp) /* {{{ */ { struct fpm_child_s *c; c = fpm_child_alloc(); if (!c) { zlog(ZLOG_ERROR, "[pool %s] unable to malloc new child", wp->config->name); return 0; } c->wp = wp; c->fd_stdout = -1; c->fd_stderr = -1; //创建父子进程通信管道 if (0 > fpm_stdio_prepare_pipes(c)) { fpm_child_free(c); return 0; } //从请求管理池取一个空闲的管理对象 //此时 c->scoreboard_i=-1 if (0 > fpm_scoreboard_proc_alloc(wp->scoreboard, &c->scoreboard_i)) { fpm_stdio_discard_pipes(c); fpm_child_free(c); return 0; } return c; }
static void fpm_child_resources_use(struct fpm_child_s *child) /* {{{ */ { struct fpm_worker_pool_s *wp; for (wp = fpm_worker_all_pools; wp; wp = wp->next) { if (wp == child->wp) { continue; } fpm_scoreboard_free(wp->scoreboard); } fpm_scoreboard_child_use(child->wp->scoreboard, child->scoreboard_i, getpid()); fpm_stdio_child_use_pipes(child); fpm_child_free(child); }
static void fpm_child_close(struct fpm_child_s *child, int in_event_loop) /* {{{ */ { if (child->fd_stdout != -1) { if (in_event_loop) { fpm_event_fire(&child->ev_stdout); } if (child->fd_stdout != -1) { close(child->fd_stdout); } } if (child->fd_stderr != -1) { if (in_event_loop) { fpm_event_fire(&child->ev_stderr); } if (child->fd_stderr != -1) { close(child->fd_stderr); } } fpm_child_free(child); }
static void fpm_resources_discard(struct fpm_child_s *child) /* {{{ */ { fpm_scoreboard_proc_free(child->wp->scoreboard, child->scoreboard_i); fpm_stdio_discard_pipes(child); fpm_child_free(child); }