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

📄 ngx_rtsig_module.c

📁 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器
💻 C
📖 第 1 页 / 共 2 页
字号:
        instance = signo - (int) rtscf->signo;        rev = c->read;        if (rev->instance != instance) {            /*             * the stale event from a file descriptor             * that was just closed in this iteration             */            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,                           "rtsig: stale event %p", c);            return NGX_OK;        }        if ((si.si_band & (POLLIN|POLLHUP|POLLERR)) && rev->active) {            rev->ready = 1;            if (flags & NGX_POST_EVENTS) {                queue = (ngx_event_t **) (rev->accept ?                               &ngx_posted_accept_events : &ngx_posted_events);                ngx_locked_post_event(rev, queue);            } else {                rev->handler(rev);            }        }        wev = c->write;        if ((si.si_band & (POLLOUT|POLLHUP|POLLERR)) && wev->active) {            wev->ready = 1;            if (flags & NGX_POST_EVENTS) {                ngx_locked_post_event(wev, &ngx_posted_events);            } else {                wev->handler(wev);            }        }        return NGX_OK;    } else if (signo == SIGALRM) {        ngx_time_update(0, 0);        return NGX_OK;    } else if (signo == SIGIO) {        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,                      "rt signal queue overflowed");        /* flush the RT signal queue */        ngx_memzero(&sa, sizeof(struct sigaction));        sa.sa_handler = SIG_DFL;        sigemptyset(&sa.sa_mask);        if (sigaction(rtscf->signo, &sa, NULL) == -1) {            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,                          "sigaction(%d, SIG_DFL) failed", rtscf->signo);        }        if (sigaction(rtscf->signo + 1, &sa, NULL) == -1) {            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,                          "sigaction(%d, SIG_DFL) failed", rtscf->signo + 1);        }        overflow = 1;        overflow_current = 0;        ngx_event_actions.process_events = ngx_rtsig_process_overflow;        return NGX_ERROR;    }    ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,                  "sigtimedwait() returned unexpected signal: %d", signo);    return NGX_ERROR;}static ngx_int_tngx_rtsig_process_overflow(ngx_cycle_t *cycle, ngx_msec_t timer,    ngx_uint_t flags){    int                name[2], rtsig_max, rtsig_nr, events, ready;    size_t             len;    ngx_err_t          err;    ngx_uint_t         tested, n, i;    ngx_event_t       *rev, *wev, **queue;    ngx_connection_t  *c;    ngx_rtsig_conf_t  *rtscf;    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,                   "rtsig process overflow");    rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module);    tested = 0;    for ( ;; ) {        n = 0;        while (n < rtscf->overflow_events) {            if (overflow_current == cycle->connection_n) {                break;            }            c = cycle->files[overflow_current++];            if (c == NULL || c->fd == -1) {                continue;            }            events = 0;            if (c->read->active && c->read->handler) {                events |= POLLIN;            }            if (c->write->active && c->write->handler) {                events |= POLLOUT;            }            if (events == 0) {                continue;            }            overflow_list[n].fd = c->fd;            overflow_list[n].events = events;            overflow_list[n].revents = 0;            n++;        }        if (n == 0) {            break;        }        for ( ;; ) {            ready = poll(overflow_list, n, 0);            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,                           "rtsig overflow poll:%d", ready);            if (ready == -1) {                err = ngx_errno;                ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,                              cycle->log, 0,                              "poll() failed while the overflow recover");                if (err == NGX_EINTR) {                    continue;                }            }            break;        }        if (ready <= 0) {            continue;        }        ngx_mutex_lock(ngx_posted_events_mutex);        for (i = 0; i < n; i++) {            c = cycle->files[overflow_list[i].fd];            if (c == NULL) {                continue;            }            rev = c->read;            if (rev->active                && !rev->closed                && rev->handler                && (overflow_list[i].revents                                          & (POLLIN|POLLERR|POLLHUP|POLLNVAL)))            {                tested++;                if ((flags & NGX_POST_THREAD_EVENTS) && !rev->accept) {                    rev->posted_ready = 1;                } else {                    rev->ready = 1;                }                if (flags & NGX_POST_EVENTS) {                    queue = (ngx_event_t **) (rev->accept ?                               &ngx_posted_accept_events : &ngx_posted_events);                    ngx_locked_post_event(rev, queue);                } else {                    rev->handler(rev);                }            }            wev = c->write;            if (wev->active                && !wev->closed                && wev->handler                && (overflow_list[i].revents                                         & (POLLOUT|POLLERR|POLLHUP|POLLNVAL)))            {                tested++;                if (flags & NGX_POST_THREAD_EVENTS) {                    wev->posted_ready = 1;                } else {                    wev->ready = 1;                }                if (flags & NGX_POST_EVENTS) {                    ngx_locked_post_event(wev, &ngx_posted_events);                } else {                    wev->handler(wev);                }            }        }        ngx_mutex_unlock(ngx_posted_events_mutex);        if (tested >= rtscf->overflow_test) {            if (ngx_linux_rtsig_max) {                /*                 * Check the current rt queue length to prevent                 * the new overflow.                 *                 * learn the "/proc/sys/kernel/rtsig-max" value because                 * it can be changed since the last checking                 */                name[0] = CTL_KERN;                name[1] = KERN_RTSIGMAX;                len = sizeof(rtsig_max);                if (sysctl(name, 2, &rtsig_max, &len, NULL, 0) == -1) {                    ngx_log_error(NGX_LOG_ALERT, cycle->log, errno,                                  "sysctl(KERN_RTSIGMAX) failed");                    return NGX_ERROR;                }                /* name[0] = CTL_KERN; */                name[1] = KERN_RTSIGNR;                len = sizeof(rtsig_nr);                if (sysctl(name, 2, &rtsig_nr, &len, NULL, 0) == -1) {                    ngx_log_error(NGX_LOG_ALERT, cycle->log, errno,                                  "sysctl(KERN_RTSIGNR) failed");                    return NGX_ERROR;                }                /*                 * drain the rt signal queue if the /"proc/sys/kernel/rtsig-nr"                 * is bigger than                 *    "/proc/sys/kernel/rtsig-max" / "rtsig_overflow_threshold"                 */                if (rtsig_max / (int) rtscf->overflow_threshold < rtsig_nr) {                    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,                                   "rtsig queue state: %d/%d",                                   rtsig_nr, rtsig_max);                    while (ngx_rtsig_process_events(cycle, 0, flags) == NGX_OK)                    {                        /* void */                    }                }            } else {                /*                 * Linux has not KERN_RTSIGMAX since 2.6.6-mm2                 * so drain the rt signal queue unconditionally                 */                while (ngx_rtsig_process_events(cycle, 0, flags) == NGX_OK) {                    /* void */                }            }            tested = 0;        }    }    if (flags & NGX_UPDATE_TIME) {        ngx_time_update(0, 0);    }    ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,                  "rt signal queue overflow recovered");    overflow = 0;    ngx_event_actions.process_events = ngx_rtsig_process_events;    return NGX_OK;}static void *ngx_rtsig_create_conf(ngx_cycle_t *cycle){    ngx_rtsig_conf_t  *rtscf;    rtscf = ngx_palloc(cycle->pool, sizeof(ngx_rtsig_conf_t));    if (rtscf == NULL) {        return NGX_CONF_ERROR;    }    rtscf->signo = NGX_CONF_UNSET;    rtscf->overflow_events = NGX_CONF_UNSET;    rtscf->overflow_test = NGX_CONF_UNSET;    rtscf->overflow_threshold = NGX_CONF_UNSET;    return rtscf;}static char *ngx_rtsig_init_conf(ngx_cycle_t *cycle, void *conf){    ngx_rtsig_conf_t  *rtscf = conf;    /* LinuxThreads use the first 3 RT signals */    ngx_conf_init_uint_value(rtscf->signo, SIGRTMIN + 10);    ngx_conf_init_uint_value(rtscf->overflow_events, 16);    ngx_conf_init_uint_value(rtscf->overflow_test, 32);    ngx_conf_init_uint_value(rtscf->overflow_threshold, 10);    return NGX_CONF_OK;}static char *ngx_check_ngx_overflow_threshold_bounds(ngx_conf_t *cf, void *post, void *data){    if (ngx_linux_rtsig_max) {        return ngx_conf_check_num_bounds(cf, post, data);    }    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,                       "\"rtsig_overflow_threshold\" is not supported "                       "since Linux 2.6.6-mm2, ignored");    return NGX_CONF_OK;}

⌨️ 快捷键说明

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