evmap_io_active_函数用于将激活指定文件描述符上的事件

 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 < || 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, );
}
}

遍历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();
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 :
ev->ev_res = res;
break;
} if (ev->ev_pri < base->event_running_priority)
base->event_continue = ; 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 = ; if (evcb->evcb_flags & EVLIST_FINALIZING)
return ; switch (evcb->evcb_flags & (EVLIST_ACTIVE|EVLIST_ACTIVE_LATER)) {
default:
EVUTIL_ASSERT();
case EVLIST_ACTIVE_LATER:
event_queue_remove_active_later(base, evcb);
r = ;
break;
case EVLIST_ACTIVE:
return ;
case :
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队列中。

函数调用关系图:

待续。。。

最新文章

  1. #Deep Learning回顾#之LeNet、AlexNet、GoogLeNet、VGG、ResNet
  2. svn 回滚到某个版本
  3. Java 遍历Map时 删除元素
  4. webstorm 10 设置文件的默认编码
  5. cs编写php字符显示问题
  6. C语言初学 给已知公式求圆周率
  7. (转)MultipleOutputFormat和MultipleOutputs
  8. linux环境下Vim的配置
  9. 知名区块链人脸识别公司iFace Chain [爱妃链] 支招,如何防止钱包数字币被盗...
  10. perl学习笔记---标量
  11. FlatList
  12. 4、JPA-EntityManager.merge()
  13. Unity最新版打包AssetBundle和加载的方法
  14. Android Fragment(二)
  15. QT OpenGL绘制三维图形(立方体、圆柱体、圆锥、球体、圆环等等)
  16. 当进行make命令学习是出现error trying to exec &#39;cc1&#39;: execvp: No such file or directory
  17. cobbler网络装机
  18. 003-and design-dva.js 知识导图-02-Reducer,Effect,Subscription,Router,dva配置,工具
  19. 快排(python)
  20. 关于CSS 里的_width是什么意思???

热门文章

  1. hihocoder第218周:AC自动机
  2. DMA直接内存存取原理
  3. POJ 2391 Ombrophobic Bovines (Floyd + Dinic +二分)
  4. HDU 3062 Party ( 2-sat tarjan)
  5. 基于Amoba实现mysql主从读写分离
  6. logstash匹配多行日志
  7. 快学Scala习题解答—第四章 映射和元组
  8. asp.net mvc中的用户登录验证过滤器
  9. 浏览器中beforeunload的使用
  10. Atitti dbutil获取多个返回结果集的解决