Mercurial > hg > nginx-vendor-current
diff src/core/ngx_cycle.c @ 154:bb61aa162c6b NGINX_0_3_24
nginx 0.3.24
*) Workaround: for bug in FreeBSD kqueue.
*) Bugfix: now a response generated by the "post_action" directive is
not transferred to a client.
*) Bugfix: the memory leaks were occurring if many log files were used.
*) Bugfix: the first "proxy_redirect" directive was working inside one
location.
*) Bugfix: on 64-bit platforms segmentation fault may occurred on start
if the many names were used in the "server_name" directives; bug
appeared in 0.3.18.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Wed, 01 Feb 2006 00:00:00 +0300 |
parents | 84910468f6de |
children | 65f0c23130e8 |
line wrap: on
line diff
--- a/src/core/ngx_cycle.c +++ b/src/core/ngx_cycle.c @@ -9,6 +9,7 @@ #include <ngx_event.h> +static void ngx_destroy_cycle_pools(ngx_conf_t *conf); static ngx_int_t ngx_cmp_sockaddr(struct sockaddr *sa1, struct sockaddr *sa2); static void ngx_clean_old_cycles(ngx_event_t *ev); @@ -40,17 +41,18 @@ static ngx_str_t error_log = ngx_null_s ngx_cycle_t * ngx_init_cycle(ngx_cycle_t *old_cycle) { - void *rv; - ngx_uint_t i, n, failed; - ngx_log_t *log; - ngx_conf_t conf; - ngx_pool_t *pool; - ngx_cycle_t *cycle, **old; - ngx_list_part_t *part; - ngx_open_file_t *file; - ngx_listening_t *ls, *nls; - ngx_core_conf_t *ccf; - ngx_core_module_t *module; + void *rv; + ngx_uint_t i, n, failed; + ngx_log_t *log; + ngx_conf_t conf; + ngx_pool_t *pool; + ngx_cycle_t *cycle, **old; + ngx_list_part_t *part; + ngx_open_file_t *file; + ngx_listening_t *ls, *nls; + ngx_core_conf_t *ccf; + ngx_core_module_t *module; + log = old_cycle->log; @@ -69,11 +71,20 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) cycle->pool = pool; cycle->log = log; cycle->old_cycle = old_cycle; - cycle->conf_file = old_cycle->conf_file; cycle->root.len = sizeof(NGX_PREFIX) - 1; cycle->root.data = (u_char *) NGX_PREFIX; + cycle->conf_file.len = old_cycle->conf_file.len; + cycle->conf_file.data = ngx_palloc(pool, old_cycle->conf_file.len + 1); + if (cycle->conf_file.data == NULL) { + ngx_destroy_pool(pool); + return NULL; + } + ngx_cpystrn(cycle->conf_file.data, old_cycle->conf_file.data, + old_cycle->conf_file.len + 1); + + n = old_cycle->pathes.nelts ? old_cycle->pathes.nelts : 10; cycle->pathes.elts = ngx_pcalloc(pool, n * sizeof(ngx_path_t *)); @@ -99,7 +110,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) } if (ngx_list_init(&cycle->open_files, pool, n, sizeof(ngx_open_file_t)) - == NGX_ERROR) + == NGX_ERROR) { ngx_destroy_pool(pool); return NULL; @@ -168,6 +179,22 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) return NULL; } + +#if 0 + cycle->shm.size = /* STUB */ ngx_pagesize; + cycle->shm.log = log; + + if (ngx_shm_alloc(&cycle->shm) != NGX_OK) { + ngx_destroy_pool(conf.temp_pool); + ngx_destroy_pool(pool); + return NULL; + } + + cycle->shm_last = cycle->shm.addr; + cycle->shm_end = cycle->shm.addr + cycle->shm.size; +#endif + + conf.ctx = cycle->conf_ctx; conf.cycle = cycle; conf.pool = pool; @@ -180,8 +207,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) #endif if (ngx_conf_parse(&conf, &cycle->conf_file) != NGX_CONF_OK) { - ngx_destroy_pool(conf.temp_pool); - ngx_destroy_pool(pool); + ngx_destroy_cycle_pools(&conf); return NULL; } @@ -203,8 +229,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) if (module->init_conf(cycle, cycle->conf_ctx[ngx_modules[i]->index]) == NGX_CONF_ERROR) { - ngx_destroy_pool(conf.temp_pool); - ngx_destroy_pool(pool); + ngx_destroy_cycle_pools(&conf); return NULL; } } @@ -397,6 +422,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) } } + if (failed) { /* rollback the new cycle configuration */ @@ -429,8 +455,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) } if (ngx_test_config) { - ngx_destroy_pool(conf.temp_pool); - ngx_destroy_pool(pool); + ngx_destroy_cycle_pools(&conf); return NULL; } @@ -447,8 +472,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) } } - ngx_destroy_pool(conf.temp_pool); - ngx_destroy_pool(pool); + ngx_destroy_cycle_pools(&conf); return NULL; } @@ -533,16 +557,16 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) ngx_destroy_pool(conf.temp_pool); - if (old_cycle->connections == NULL) { - /* an old cycle is an init cycle */ + if (ngx_process == NGX_PROCESS_MASTER || ngx_is_init_cycle(old_cycle)) { + + if (old_cycle->shm.addr) { + ngx_shm_free(&old_cycle->shm); + } + ngx_destroy_pool(old_cycle->pool); return cycle; } - if (ngx_process == NGX_PROCESS_MASTER) { - ngx_destroy_pool(old_cycle->pool); - return cycle; - } if (ngx_temp_pool == NULL) { ngx_temp_pool = ngx_create_pool(128, cycle->log); @@ -586,6 +610,15 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) } +static void +ngx_destroy_cycle_pools(ngx_conf_t *conf) +{ + ngx_shm_free(&conf->cycle->shm); + ngx_destroy_pool(conf->temp_pool); + ngx_destroy_pool(conf->pool); +} + + static ngx_int_t ngx_cmp_sockaddr(struct sockaddr *sa1, struct sockaddr *sa2) { @@ -623,7 +656,7 @@ ngx_create_pidfile(ngx_cycle_t *cycle, n ngx_file_t file; ngx_core_conf_t *ccf, *old_ccf; - if (!ngx_test_config && old_cycle && old_cycle->conf_ctx == NULL) { + if (!ngx_test_config && ngx_is_init_cycle(old_cycle)) { /* * do not create the pid file in the first ngx_init_cycle() call