📄 ngx_eventport_module.c
字号:
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 + -