From: tom916 Date: Fri, 16 Sep 2016 14:37:09 +0000 (+0800) Subject: fix every work call mmap X-Git-Tag: php-7.0.12RC1~22^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=807004a446c3e19bd1d12111cda841fea3db4135;p=php fix every work call mmap fix fpm_scoreboard_free --- diff --git a/sapi/fpm/fpm/fpm_scoreboard.c b/sapi/fpm/fpm/fpm_scoreboard.c index 7ddf1e84d9..3e57333e9f 100644 --- a/sapi/fpm/fpm/fpm_scoreboard.c +++ b/sapi/fpm/fpm/fpm_scoreboard.c @@ -52,16 +52,18 @@ int fpm_scoreboard_init_main() /* {{{ */ return -1; } - wp->scoreboard = fpm_shm_alloc(sizeof(struct fpm_scoreboard_s) + (wp->config->pm_max_children - 1) * sizeof(struct fpm_scoreboard_proc_s *)); - if (!wp->scoreboard) { + int scoreboard_size = sizeof(struct fpm_scoreboard_s) + (wp->config->pm_max_children) * sizeof(struct fpm_scoreboard_proc_s *); + int scoreboard_nprocs_size = sizeof(struct fpm_scoreboard_proc_s) * wp->config->pm_max_children; + void *shm_mem = fpm_shm_alloc(scoreboard_size + scoreboard_nprocs_size); + if (!shm_mem) { return -1; } + wp->scoreboard = shm_mem; wp->scoreboard->nprocs = wp->config->pm_max_children; + shm_mem += scoreboard_size; for (i = 0; i < wp->scoreboard->nprocs; i++) { - wp->scoreboard->procs[i] = fpm_shm_alloc(sizeof(struct fpm_scoreboard_proc_s)); - if (!wp->scoreboard->procs[i]) { - return -1; - } + wp->scoreboard->procs[i] = shm_mem; + shm_mem += sizeof(struct fpm_scoreboard_proc_s); } wp->scoreboard->pm = wp->config->pm; @@ -239,13 +241,10 @@ void fpm_scoreboard_free(struct fpm_scoreboard_s *scoreboard) /* {{{ */ return; } - for (i = 0; i < scoreboard->nprocs; i++) { - if (!scoreboard->procs[i]) { - continue; - } - fpm_shm_free(scoreboard->procs[i], sizeof(struct fpm_scoreboard_proc_s)); - } - fpm_shm_free(scoreboard, sizeof(struct fpm_scoreboard_s)); + int scoreboard_size = sizeof(struct fpm_scoreboard_s) + (scoreboard->nprocs) * sizeof(struct fpm_scoreboard_proc_s *); + int scoreboard_nprocs_size = sizeof(struct fpm_scoreboard_proc_s) * scoreboard->nprocs; + + fpm_shm_free(scoreboard, scoreboard_size + scoreboard_nprocs_size); } /* }}} */