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

📄 ngx_cycle.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 3 页
字号:
            {                continue;            }            if (shm_zone[i].shm.size == oshm_zone[n].shm.size) {                shm_zone[i].shm.addr = oshm_zone[n].shm.addr;                if (shm_zone[i].init(&shm_zone[i], oshm_zone[n].data)                    != NGX_OK)                {                    goto failed;                }                goto shm_zone_found;            }            ngx_shm_free(&oshm_zone[n].shm);            break;        }        if (ngx_shm_alloc(&shm_zone[i].shm) != NGX_OK) {            goto failed;        }        shpool = (ngx_slab_pool_t *) shm_zone[i].shm.addr;        shpool->end = shm_zone[i].shm.addr + shm_zone[i].shm.size;        shpool->min_shift = 3;#if (NGX_HAVE_ATOMIC_OPS)        lock_file = NULL;#else        lock_file = ngx_palloc(cycle->pool,                               cycle->lock_file.len + shm_zone[i].name.len);        if (lock_file == NULL) {            goto failed;        }        (void) ngx_cpystrn(ngx_cpymem(lock_file, cycle->lock_file.data,                                      cycle->lock_file.len),                           shm_zone[i].name.data, shm_zone[i].name.len + 1);#endif        if (ngx_shmtx_create(&shpool->mutex, (void *) &shpool->lock, lock_file)            != NGX_OK)        {            goto failed;        }        ngx_slab_init(shpool);        if (shm_zone[i].init(&shm_zone[i], NULL) != NGX_OK) {            goto failed;        }    shm_zone_found:        continue;    }    /* handle the listening sockets */    if (old_cycle->listening.nelts) {        ls = old_cycle->listening.elts;        for (i = 0; i < old_cycle->listening.nelts; i++) {            ls[i].remain = 0;        }        nls = cycle->listening.elts;        for (n = 0; n < cycle->listening.nelts; n++) {            for (i = 0; i < old_cycle->listening.nelts; i++) {                if (ls[i].ignore) {                    continue;                }                if (ngx_cmp_sockaddr(nls[n].sockaddr, ls[i].sockaddr) == NGX_OK)                {                    nls[n].fd = ls[i].fd;                    nls[n].previous = &ls[i];                    ls[i].remain = 1;                    if (ls[n].backlog != nls[i].backlog) {                        nls[n].listen = 1;                    }#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)                    /*                     * FreeBSD, except the most recent versions,                     * could not remove accept filter                     */                    nls[n].deferred_accept = ls[i].deferred_accept;                    if (ls[i].accept_filter && nls[n].accept_filter) {                        if (ngx_strcmp(ls[i].accept_filter,                                       nls[n].accept_filter)                            != 0)                        {                            nls[n].delete_deferred = 1;                            nls[n].add_deferred = 1;                        }                    } else if (ls[i].accept_filter) {                        nls[n].delete_deferred = 1;                    } else if (nls[n].accept_filter) {                        nls[n].add_deferred = 1;                    }#endif#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)                    if (ls[n].deferred_accept && !nls[n].deferred_accept) {                        nls[n].delete_deferred = 1;                    } else if (ls[i].deferred_accept != nls[n].deferred_accept)                    {                        nls[n].add_deferred = 1;                    }#endif                    break;                }            }            if (nls[n].fd == -1) {                nls[n].open = 1;            }        }    } else {        ls = cycle->listening.elts;        for (i = 0; i < cycle->listening.nelts; i++) {            ls[i].open = 1;#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)            if (ls[i].accept_filter) {                ls[i].add_deferred = 1;            }#endif#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)            if (ls[i].deferred_accept) {                ls[i].add_deferred = 1;            }#endif        }    }    if (ngx_open_listening_sockets(cycle) != NGX_OK) {        goto failed;    }    if (!ngx_test_config) {        ngx_configure_listening_socket(cycle);    }    /* commit the new cycle configuration */#if !(NGX_WIN32)    if (!ngx_test_config && cycle->log->file->fd != STDERR_FILENO) {        ngx_log_debug3(NGX_LOG_DEBUG_CORE, log, 0,                       "dup2: %p %d \"%s\"",                       cycle->log->file,                       cycle->log->file->fd, cycle->log->file->name.data);        if (dup2(cycle->log->file->fd, STDERR_FILENO) == -1) {            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,                          "dup2(STDERR) failed");            /* fatal */            exit(1);        }    }#endif    pool->log = cycle->log;    for (i = 0; ngx_modules[i]; i++) {        if (ngx_modules[i]->init_module) {            if (ngx_modules[i]->init_module(cycle) != NGX_OK) {                /* fatal */                exit(1);            }        }    }    /* close and delete stuff that lefts from an old cycle */    /* free the unnecessary shared memory */    opart = &old_cycle->shared_memory.part;    oshm_zone = opart->elts;    for (i = 0; /* void */ ; i++) {        if (i >= opart->nelts) {            if (opart->next == NULL) {                goto old_shm_zone_done;            }            opart = opart->next;            oshm_zone = opart->elts;            i = 0;        }        part = &cycle->shared_memory.part;        shm_zone = part->elts;        for (n = 0; /* void */ ; n++) {            if (n >= part->nelts) {                if (part->next == NULL) {                    break;                }                part = part->next;                shm_zone = part->elts;                n = 0;            }            if (oshm_zone[i].name.len == shm_zone[n].name.len                && ngx_strncmp(oshm_zone[i].name.data,                               shm_zone[n].name.data,                               oshm_zone[i].name.len)                == 0)            {                goto live_shm_zone;            }        }        ngx_shm_free(&oshm_zone[i].shm);    live_shm_zone:        continue;    }old_shm_zone_done:    /* close the unnecessary listening sockets */    ls = old_cycle->listening.elts;    for (i = 0; i < old_cycle->listening.nelts; i++) {        if (ls[i].remain) {            continue;        }        if (ngx_close_socket(ls[i].fd) == -1) {            ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,                          ngx_close_socket_n " listening socket on %V failed",                          &ls[i].addr_text);        }    }    /* close the unnecessary open files */    part = &old_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].fd == NGX_INVALID_FILE || file[i].fd == ngx_stderr_fileno) {            continue;        }        if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) {            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,                          ngx_close_file_n " \"%s\" failed",                          file[i].name.data);        }    }    ngx_destroy_pool(conf.temp_pool);    if (ngx_process == NGX_PROCESS_MASTER || ngx_is_init_cycle(old_cycle)) {        /*         * perl_destruct() frees environ if it is not the same as it was at         * perl_construct() time.  So we have saved an previous cycle         * environment before ngx_conf_parse() where it will be changed.         */        env = environ;        environ = senv;        ngx_destroy_pool(old_cycle->pool);        cycle->old_cycle = NULL;        environ = env;        return cycle;    }    if (ngx_temp_pool == NULL) {        ngx_temp_pool = ngx_create_pool(128, cycle->log);        if (ngx_temp_pool == NULL) {            ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,                          "can not create ngx_temp_pool");            exit(1);        }        n = 10;        ngx_old_cycles.elts = ngx_pcalloc(ngx_temp_pool,                                          n * sizeof(ngx_cycle_t *));        if (ngx_old_cycles.elts == NULL) {            exit(1);        }        ngx_old_cycles.nelts = 0;        ngx_old_cycles.size = sizeof(ngx_cycle_t *);        ngx_old_cycles.nalloc = n;        ngx_old_cycles.pool = ngx_temp_pool;        ngx_cleaner_event.handler = ngx_clean_old_cycles;        ngx_cleaner_event.log = cycle->log;        ngx_cleaner_event.data = &dumb;        dumb.fd = (ngx_socket_t) -1;    }    ngx_temp_pool->log = cycle->log;    old = ngx_array_push(&ngx_old_cycles);    if (old == NULL) {        exit(1);    }    *old = old_cycle;    if (!ngx_cleaner_event.timer_set) {        ngx_add_timer(&ngx_cleaner_event, 30000);        ngx_cleaner_event.timer_set = 1;    }    return cycle;failed:    if (!ngx_is_init_cycle(old_cycle)) {        old_ccf = (ngx_core_conf_t *) ngx_get_conf(old_cycle->conf_ctx,                                                   ngx_core_module);        if (old_ccf->environment) {            environ = old_ccf->environment;        }    }    /* rollback the new cycle configuration */    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].fd == NGX_INVALID_FILE || file[i].fd == ngx_stderr_fileno) {            continue;        }        if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) {            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,                          ngx_close_file_n " \"%s\" failed",                          file[i].name.data);        }    }    if (ngx_test_config) {        ngx_destroy_cycle_pools(&conf);        return NULL;    }    ls = cycle->listening.elts;    for (i = 0; i < cycle->listening.nelts; i++) {        if (ls[i].fd == -1 || !ls[i].open) {            continue;        }        if (ngx_close_socket(ls[i].fd) == -1) {            ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,                          ngx_close_socket_n " %V failed",

⌨️ 快捷键说明

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