libevent源码分析:evmap_io_active_函数
2017-01-12 07:55
471 查看
evmap_io_active_函数用于将激活指定文件描述符上的事件
遍历evmap_io的成员events,在每一次遍历中实际调用ev_active_nolock_
该函数在最后又调用函数event_callback_activate_nolock
该函数最后又调用event_queue_insert_active
1、L18将该事件插入到event_base.activequeues队列中。
函数调用关系图:
待续。。。
void evmap_io_active_(struct event_base *base, evutil_socket_t fd, short events) { struct event_io_map *io = &base->io; struct evmap_io *ctx; struct event *ev; #ifndef EVMAP_USE_HT if (fd < 0 || fd >= io->nentries) return; #endif GET_IO_SLOT(ctx, io, fd, evmap_io); if (NULL == ctx) return; LIST_FOREACH(ev, &ctx->events, ev_io_next) { if (ev->ev_events & events) event_active_nolock_(ev, ev->ev_events & events, 1); } }
遍历evmap_io的成员events,在每一次遍历中实际调用ev_active_nolock_
void event_active_nolock_(struct event *ev, int res, short ncalls) { struct event_base *base; event_debug(("event_active: %p (fd "EV_SOCK_FMT"), res %d, callback %p", ev, EV_SOCK_ARG(ev->ev_fd), (int)res, ev->ev_callback)); base = ev->ev_base; EVENT_BASE_ASSERT_LOCKED(base); if (ev->ev_flags & EVLIST_FINALIZING) { /* XXXX debug */ return; } switch ((ev->ev_flags & (EVLIST_ACTIVE|EVLIST_ACTIVE_LATER))) { default: case EVLIST_ACTIVE|EVLIST_ACTIVE_LATER: EVUTIL_ASSERT(0); break; case EVLIST_ACTIVE: /* We get different kinds of events, add them together */ ev->ev_res |= res; return; case EVLIST_ACTIVE_LATER: ev->ev_res |= res; break; case 0: ev->ev_res = res; break; } if (ev->ev_pri < base->event_running_priority) base->event_continue = 1; if (ev->ev_events & EV_SIGNAL) { #ifndef EVENT__DISABLE_THREAD_SUPPORT if (base->current_event == event_to_event_callback(ev) && !EVBASE_IN_THREAD(base)) { ++base->current_event_waiters; EVTHREAD_COND_WAIT(base->current_event_cond, base->th_base_lock); } #endif ev->ev_ncalls = ncalls; ev->ev_pncalls = NULL; } event_callback_activate_nolock_(base, event_to_event_callback(ev)); }
该函数在最后又调用函数event_callback_activate_nolock
int event_callback_activate_nolock_(struct event_base *base, struct event_callback *evcb) { int r = 1; if (evcb->evcb_flags & EVLIST_FINALIZING) return 0; switch (evcb->evcb_flags & (EVLIST_ACTIVE|EVLIST_ACTIVE_LATER)) { default: EVUTIL_ASSERT(0); case EVLIST_ACTIVE_LATER: event_queue_remove_active_later(base, evcb); r = 0; break; case EVLIST_ACTIVE: return 0; case 0: break; } event_queue_insert_active(base, evcb); if (EVBASE_NEED_NOTIFY(base)) evthread_notify_base(base); return r; }
该函数最后又调用event_queue_insert_active
static void event_queue_insert_active(struct event_base *base, struct event_callback *evcb) { EVENT_BASE_ASSERT_LOCKED(base); if (evcb->evcb_flags & EVLIST_ACTIVE) { /* Double insertion is possible for active events */ return; } INCR_EVENT_COUNT(base, evcb->evcb_flags); evcb->evcb_flags |= EVLIST_ACTIVE; base->event_count_active++; MAX_EVENT_COUNT(base->event_count_active_max, base->event_count_active); EVUTIL_ASSERT(evcb->evcb_pri < base->nactivequeues); TAILQ_INSERT_TAIL(&base->activequeues[evcb->evcb_pri], evcb, evcb_active_next); }
1、L18将该事件插入到event_base.activequeues队列中。
函数调用关系图:
待续。。。
相关文章推荐
- igllib 203 Curvature directions
- 【菜鸟数据库学习日记】从头开始学MySQL(2)
- es6笔记1^_^let、string、number、math
- NET Core写了一个轻量级的Interception框架[开源]
- Android项目实践之菜鸟养成(五)用户体验之Android活动的生命周期
- JAVA知乎爬虫
- Zookeeper配置文件中的配置项解释和Zookeeper的安装
- Core中使用Razor视图引擎渲染视图为字符串 阅读目录
- zoj2500
- TensorFlow官方教程学习笔记(四)——MNIST数据集的读取
- C#使用ES
- net core 认证及简单集群
- 软件工程需求分析
- Kafka Offset 1
- 微信H5使用resLoader实现加载页效果
- CoreCLR源码2
- win10 打开hlp文件
- 从零到百亿互联网金融架构发展史
- NET SignalR2
- libevent源码分析:epoll后端实现