⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ngx_cycle.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * Copyright (C) Igor Sysoev */#include <ngx_config.h>#include <ngx_core.h>#include <ngx_event.h>static ngx_int_t ngx_test_lockfile(u_char *file, ngx_log_t *log);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);volatile ngx_cycle_t  *ngx_cycle;ngx_array_t            ngx_old_cycles;static ngx_pool_t     *ngx_temp_pool;static ngx_event_t     ngx_cleaner_event;ngx_uint_t             ngx_test_config;#if (NGX_THREADS)ngx_tls_key_t          ngx_core_tls_key;#endif/* STUB NAME */static ngx_connection_t  dumb;/* STUB */#ifdef NGX_ERROR_LOG_PATHstatic ngx_str_t  error_log = ngx_string(NGX_ERROR_LOG_PATH);#elsestatic ngx_str_t  error_log = ngx_null_string;#endifngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle){    void                *rv;    char               **senv, **env;    u_char              *lock_file;    ngx_uint_t           i, n;    ngx_log_t           *log;    ngx_conf_t           conf;    ngx_pool_t          *pool;    ngx_cycle_t         *cycle, **old;    ngx_shm_zone_t      *shm_zone, *oshm_zone;    ngx_slab_pool_t     *shpool;    ngx_list_part_t     *part, *opart;    ngx_open_file_t     *file;    ngx_listening_t     *ls, *nls;    ngx_core_conf_t     *ccf, *old_ccf;    ngx_core_module_t   *module;    log = old_cycle->log;    pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);    if (pool == NULL) {        return NULL;    }    pool->log = log;    cycle = ngx_pcalloc(pool, sizeof(ngx_cycle_t));    if (cycle == NULL) {        ngx_destroy_pool(pool);        return NULL;    }    cycle->pool = pool;    cycle->log = log;    cycle->old_cycle = old_cycle;    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 *));    if (cycle->pathes.elts == NULL) {        ngx_destroy_pool(pool);        return NULL;    }    cycle->pathes.nelts = 0;    cycle->pathes.size = sizeof(ngx_path_t *);    cycle->pathes.nalloc = n;    cycle->pathes.pool = pool;    if (old_cycle->open_files.part.nelts) {        n = old_cycle->open_files.part.nelts;        for (part = old_cycle->open_files.part.next; part; part = part->next) {            n += part->nelts;        }    } else {        n = 20;    }    if (ngx_list_init(&cycle->open_files, pool, n, sizeof(ngx_open_file_t))        == NGX_ERROR)    {        ngx_destroy_pool(pool);        return NULL;    }    if (old_cycle->shared_memory.part.nelts) {        n = old_cycle->shared_memory.part.nelts;        for (part = old_cycle->shared_memory.part.next; part; part = part->next)        {            n += part->nelts;        }    } else {        n = 1;    }    if (ngx_list_init(&cycle->shared_memory, pool, n, sizeof(ngx_shm_zone_t))        == NGX_ERROR)    {        ngx_destroy_pool(pool);        return NULL;    }    cycle->new_log = ngx_log_create_errlog(cycle, NULL);    if (cycle->new_log == NULL) {        ngx_destroy_pool(pool);        return NULL;    }    cycle->new_log->file->name = error_log;    n = old_cycle->listening.nelts ? old_cycle->listening.nelts : 10;    cycle->listening.elts = ngx_pcalloc(pool, n * sizeof(ngx_listening_t));    if (cycle->listening.elts == NULL) {        ngx_destroy_pool(pool);        return NULL;    }    cycle->listening.nelts = 0;    cycle->listening.size = sizeof(ngx_listening_t);    cycle->listening.nalloc = n;    cycle->listening.pool = pool;    cycle->conf_ctx = ngx_pcalloc(pool, ngx_max_module * sizeof(void *));    if (cycle->conf_ctx == NULL) {        ngx_destroy_pool(pool);        return NULL;    }    for (i = 0; ngx_modules[i]; i++) {        if (ngx_modules[i]->type != NGX_CORE_MODULE) {            continue;        }        module = ngx_modules[i]->ctx;        if (module->create_conf) {            rv = module->create_conf(cycle);            if (rv == NGX_CONF_ERROR) {                ngx_destroy_pool(pool);                return NULL;            }            cycle->conf_ctx[ngx_modules[i]->index] = rv;        }    }    senv = environ;    ngx_memzero(&conf, sizeof(ngx_conf_t));    /* STUB: init array ? */    conf.args = ngx_array_create(pool, 10, sizeof(ngx_str_t));    if (conf.args == NULL) {        ngx_destroy_pool(pool);        return NULL;    }    conf.temp_pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);    if (conf.temp_pool == NULL) {        ngx_destroy_pool(pool);        return NULL;    }    conf.ctx = cycle->conf_ctx;    conf.cycle = cycle;    conf.pool = pool;    conf.log = log;    conf.module_type = NGX_CORE_MODULE;    conf.cmd_type = NGX_MAIN_CONF;#if 0    log->log_level = NGX_LOG_DEBUG_ALL;#endif    if (ngx_conf_parse(&conf, &cycle->conf_file) != NGX_CONF_OK) {        ngx_destroy_cycle_pools(&conf);        return NULL;    }    if (ngx_test_config) {        ngx_log_error(NGX_LOG_INFO, log, 0,                      "the configuration file %s syntax is ok",                      cycle->conf_file.data);    }    for (i = 0; ngx_modules[i]; i++) {        if (ngx_modules[i]->type != NGX_CORE_MODULE) {            continue;        }        module = ngx_modules[i]->ctx;        if (module->init_conf) {            if (module->init_conf(cycle, cycle->conf_ctx[ngx_modules[i]->index])                == NGX_CONF_ERROR)            {                ngx_destroy_cycle_pools(&conf);                return NULL;            }        }    }    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);#if !(NGX_WIN32)    if (ngx_test_config) {        if (ngx_create_pidfile(&ccf->pid, log) != NGX_OK) {            goto failed;        }    } else if (!ngx_is_init_cycle(old_cycle)) {        /*         * we do not create the pid file in the first ngx_init_cycle() call         * because we need to write the demonized process pid         */        old_ccf = (ngx_core_conf_t *) ngx_get_conf(old_cycle->conf_ctx,                                                   ngx_core_module);        if (ccf->pid.len != old_ccf->pid.len            || ngx_strcmp(ccf->pid.data, old_ccf->pid.data) != 0)        {            /* new pid file name */            if (ngx_create_pidfile(&ccf->pid, log) != NGX_OK) {                goto failed;            }            ngx_delete_pidfile(old_cycle);        }    }#endif    if (ngx_test_lockfile(cycle->lock_file.data, log) != NGX_OK) {        goto failed;    }    if (ngx_create_pathes(cycle, ccf->user) != NGX_OK) {        goto failed;    }    /* open the new files */    part = &cycle->open_files.part;    file = part->elts;    for (i = 0; /* void */ ; i++) {        if (i >= part->nelts) {            if (part->next == NULL) {                break;            }            part = part->next;            file = part->elts;            i = 0;        }        if (file[i].name.data == NULL) {            continue;        }        file[i].fd = ngx_open_file(file[i].name.data, NGX_FILE_RDWR,                                   NGX_FILE_CREATE_OR_OPEN|NGX_FILE_APPEND,                                   NGX_FILE_DEFAULT_ACCESS);        ngx_log_debug3(NGX_LOG_DEBUG_CORE, log, 0,                       "log: %p %d \"%s\"",                       &file[i], file[i].fd, file[i].name.data);        if (file[i].fd == NGX_INVALID_FILE) {            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,                          ngx_open_file_n " \"%s\" failed",                          file[i].name.data);            goto failed;        }#if (NGX_WIN32)        if (ngx_file_append_mode(file[i].fd) != NGX_OK) {            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,                          ngx_file_append_mode_n " \"%s\" failed",                          file[i].name.data);            goto failed;        }#else        if (fcntl(file[i].fd, F_SETFD, FD_CLOEXEC) == -1) {            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,                          "fcntl(FD_CLOEXEC) \"%s\" failed",                          file[i].name.data);            goto failed;        }#endif    }    cycle->log = cycle->new_log;    pool->log = cycle->new_log;    if (cycle->log->log_level == 0) {        cycle->log->log_level = NGX_LOG_ERR;    }    /* create shared memory */    part = &cycle->shared_memory.part;    shm_zone = part->elts;    for (i = 0; /* void */ ; i++) {        if (i >= part->nelts) {            if (part->next == NULL) {                break;            }            part = part->next;            shm_zone = part->elts;            i = 0;        }        if (shm_zone[i].shm.size == 0) {            ngx_log_error(NGX_LOG_EMERG, log, 0,                          "zero size shared memory zone \"%V\"",                          &shm_zone[i].name);            goto failed;        }        if (shm_zone[i].init == NULL) {            /* unused shared zone */            continue;        }        shm_zone[i].shm.log = cycle->log;        opart = &old_cycle->shared_memory.part;        oshm_zone = opart->elts;        for (n = 0; /* void */ ; n++) {            if (n >= opart->nelts) {                if (opart->next == NULL) {                    break;                }                opart = opart->next;                oshm_zone = opart->elts;                n = 0;            }            if (shm_zone[i].name.len != oshm_zone[n].name.len) {                continue;            }            if (ngx_strncmp(shm_zone[i].name.data, oshm_zone[n].name.data,                            shm_zone[i].name.len)                != 0)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -