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

📄 ngx_eventport_module.c

📁 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器
💻 C
📖 第 1 页 / 共 2 页
字号:
        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,                      "port_associate() failed");        return NGX_ERROR;    }    ev->active = 1;    ev->oneshot = 1;    return NGX_OK;}static ngx_int_tngx_eventport_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags){    ngx_event_t       *e;    ngx_connection_t  *c;    /*     * when the file descriptor is closed, the event port automatically     * dissociates it from the port, so we do not need to dissociate explicity     * the event before the closing the file descriptor     */    if (flags & NGX_CLOSE_EVENT) {        ev->active = 0;        ev->oneshot = 0;        return NGX_OK;    }    c = ev->data;    if (event == NGX_READ_EVENT) {        e = c->write;        event = POLLOUT;    } else {        e = c->read;        event = POLLIN;    }    if (e->oneshot) {        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,                       "eventport change event: fd:%d ev:%04Xi", c->fd, event);        if (port_associate(ep, PORT_SOURCE_FD, c->fd, event,                           (void *) ((uintptr_t) ev | ev->instance))            == -1)        {            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,                          "port_associate() failed");            return NGX_ERROR;        }    } else {        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,                       "eventport del event: fd:%d", c->fd);        if (port_dissociate(ep, PORT_SOURCE_FD, c->fd) == -1) {            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,                          "port_dissociate() failed");            return NGX_ERROR;        }    }    ev->active = 0;    ev->oneshot = 0;    return NGX_OK;}ngx_int_tngx_eventport_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,    ngx_uint_t flags){    int                 n, revents;    u_int               events;    ngx_err_t           err;    ngx_int_t           instance;    ngx_uint_t          i, level;    ngx_event_t        *ev, *rev, *wev, **queue;    ngx_connection_t   *c;    struct timespec     ts, *tp;    if (timer == NGX_TIMER_INFINITE) {        tp = NULL;    } else {        ts.tv_sec = timer / 1000;        ts.tv_nsec = (timer % 1000) * 1000000;        tp = &ts;    }    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,                   "eventport timer: %M", timer);    events = 1;    n = port_getn(ep, event_list, (u_int) nevents, &events, tp);    err = ngx_errno;    if (flags & NGX_UPDATE_TIME) {        ngx_time_update(0, 0);    }    if (n == -1) {        if (err == ETIME) {            if (timer != NGX_TIMER_INFINITE) {                return NGX_OK;            }            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,                          "port_getn() returned no events without timeout");            return NGX_ERROR;        }        level = (err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT;        ngx_log_error(level, cycle->log, err, "port_getn() failed");        return NGX_ERROR;    }    if (events == 0) {        if (timer != NGX_TIMER_INFINITE) {            return NGX_OK;        }        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,                      "port_getn() returned no events without timeout");        return NGX_ERROR;    }    ngx_mutex_lock(ngx_posted_events_mutex);    for (i = 0; i < events; i++) {        if (event_list[i].portev_source == PORT_SOURCE_TIMER) {            ngx_time_update(0, 0);            continue;        }        ev = event_list[i].portev_user;        switch (event_list[i].portev_source) {        case PORT_SOURCE_FD:            instance = (uintptr_t) ev & 1;            ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1);            if (ev->closed || ev->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,                               "eventport: stale event %p", ev);                continue;            }            revents = event_list[i].portev_events;            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,                           "eventport: fd:%d, ev:%04Xd",                           event_list[i].portev_object, revents);            if (revents & (POLLERR|POLLHUP|POLLNVAL)) {                ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,                               "port_getn() error fd:%d ev:%04Xd",                               event_list[i].portev_object, revents);            }            if (revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) {                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,                              "strange port_getn() events fd:%d ev:%04Xd",                              event_list[i].portev_object, revents);            }            if ((revents & (POLLERR|POLLHUP|POLLNVAL))                 && (revents & (POLLIN|POLLOUT)) == 0)            {                /*                 * if the error events were returned without POLLIN or POLLOUT,                 * then add these flags to handle the events at least in one                 * active handler                 */                revents |= POLLIN|POLLOUT;            }            c = ev->data;            rev = c->read;            wev = c->write;            rev->active = 0;            wev->active = 0;            if (revents & POLLIN) {                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);                    if (ev->closed) {                        continue;                    }                }                if (rev->accept) {                    if (ngx_use_accept_mutex) {                        ngx_accept_events = 1;                        continue;                    }                    if (port_associate(ep, PORT_SOURCE_FD, c->fd, POLLIN,                                       (void *) ((uintptr_t) ev | ev->instance))                        == -1)                    {                        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,                                      "port_associate() failed");                        return NGX_ERROR;                    }                }            }            if (revents & POLLOUT) {                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);                }            }            continue;        default:            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,                          "unexpected even_port object %d",                          event_list[i].portev_object);            continue;        }    }    ngx_mutex_unlock(ngx_posted_events_mutex);    return NGX_OK;}static void *ngx_eventport_create_conf(ngx_cycle_t *cycle){    ngx_eventport_conf_t  *epcf;    epcf = ngx_palloc(cycle->pool, sizeof(ngx_eventport_conf_t));    if (epcf == NULL) {        return NGX_CONF_ERROR;    }    epcf->events = NGX_CONF_UNSET;    return epcf;}static char *ngx_eventport_init_conf(ngx_cycle_t *cycle, void *conf){    ngx_eventport_conf_t *epcf = conf;    ngx_conf_init_uint_value(epcf->events, 32);    return NGX_CONF_OK;}

⌨️ 快捷键说明

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