NGX epoll_wait是否封装了 问题描述在代码过程注释中,82行处
2013-07-12 18:04
477 查看
static ngx_int_t ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags) { int events; uint32_t revents; ngx_int_t instance, i; ngx_uint_t level; ngx_err_t err; ngx_event_t *rev, *wev, **queue; ngx_connection_t *c; /* NGX_TIMER_INFINITE == INFTIM */ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "epoll timer: %M", timer); // ep : epoll_create // event_list:用于回传时间的数组 // nevents:每次能够处理的最大数目的事件 // events:返回值表示有事件的描述符个数 events = epoll_wait(ep, event_list, (int) nevents, timer); // 返回值等于-1 吗, err = (events == -1) ? ngx_errno : 0; // 若需更新时间标志置位或有告警,则更新系统时间 if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { ngx_time_update(); } // 若有错误 if (err) { // 若是系统终端日志级别设置为LOG_INFO if (err == NGX_EINTR) { if (ngx_event_timer_alarm) { ngx_event_timer_alarm = 0; return NGX_OK; } level = NGX_LOG_INFO; } else { // 或设置为ALERT level = NGX_LOG_ALERT; } // 写日志,退出 ngx_log_error(level, cycle->log, err, "epoll_wait() failed"); return NGX_ERROR; } // 返回事件数值为0,异常 if (events == 0) { if (timer != NGX_TIMER_INFINITE) { return NGX_OK; } ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "epoll_wait() returned no events without timeout"); return NGX_ERROR; } // 加锁 ngx_mutex_lock(ngx_posted_events_mutex); for (i = 0; i < events; i++) { c = event_list[i].data.ptr; // ??? instance = (uintptr_t) c & 1; // 若是读事件,并且是ACCEPT ,这时的C内存是哪里来的?是否封装了epoll_wait函数 c = (ngx_connection_t *) ((uintptr_t) c & (uintptr_t) ~1); // 获取连接读事件 rev = c->read; // 检查FD if (c->fd == -1 || 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, "epoll: stale event %p", c); continue; } // 获取事件ID revents = event_list[i].events;/* Epoll events */ ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "epoll: fd:%d ev:%04XD d:%p", c->fd, revents, event_list[i].data.ptr); if (revents & (EPOLLERR|EPOLLHUP)) { ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "epoll_wait() error on fd:%d ev:%04XD", c->fd, revents); } #if 0 if (revents & ~(EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP)) { ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "strange epoll_wait() events fd:%d ev:%04XD", c->fd, revents); } #endif if ((revents & (EPOLLERR|EPOLLHUP)) && (revents & (EPOLLIN|EPOLLOUT)) == 0) { /* * if the error events were returned without EPOLLIN or EPOLLOUT, * then add these flags to handle the events at least in one * active handler */ revents |= EPOLLIN|EPOLLOUT; } // 读事件 if ((revents & EPOLLIN) && rev->active) { 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 ((revents & EPOLLOUT) && wev->active) { if (c->fd == -1 || wev->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, "epoll: stale event %p", c); continue; } 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); return NGX_OK; }
相关文章推荐
- pthread_cond_wait()使用、执行过程及一些问题
- [Android源码开发] Android 4.3的代码迁移到4.4的过程中遭遇的种种问题及解决方法
- 问题描述:网关或者代理服务器使用的是ISA防火墙;当客户端浏览网页时,弹出的错误代码: 500 internal server error。不支持请求(50)
- JDBC无封装下的标准代码和JDBC问题总结-V1.0
- UDT源码剖析(五):UDT::cleanup()过程代码注释
- 快速解决eclipse中注释的代码依然会执行的问题
- 关于计算机将c代码转换成汇编代码的过程描述
- [项目过程中所遇到的各种问题记录]ORM篇——有关NHibernate查询封装
- 原生js封装AJAX(代码+注释)
- Nginx源码分析 - HTTP模块篇 - ngx_http_wait_request_handler函数和HTTP Request解析过程
- 解决eclipse中java代码注释变成乱码的问题
- eclipse 代码注释模板几个问题
- ubuntu python代码注释问题
- 写代码时各种注释 引起的致命问题
- Android Studio 导入 Eclipse 的代码后,代码中的注释显示乱码问题
- myeclipse中java代码注释模板问题
- 今天运行代码过程中解决的几个问题
- 第三方库代码使用过程中的相关问题说明
- Android Studio 导入 Eclipse 的代码后,代码中的注释显示乱码问题
- PHP代码被浏览器强制注释的问题