Chinaunix首页 | 论坛 | 博客
  • 博客访问: 469285
  • 博文数量: 111
  • 博客积分: 2332
  • 博客等级: 大尉
  • 技术积分: 1187
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-29 11:22
文章分类

全部博文(111)

文章存档

2013年(9)

2012年(28)

2011年(17)

2010年(28)

2009年(29)

我的朋友

分类: C/C++

2012-09-08 18:44:50

调用callback函数不是在epoll或者select的dispatch函数里执行的,epoll的dispatch函数只是起着定时器的作用,其阻塞作用(在timer这中用法里面)。epoll和select只是一直阻塞,然后到了时间自后就退出了(在timer这种用法里面)。然后在event_base_loop函数里面,调用了timeout_process从最小堆里面取出了到时间的事件,在timeout_process里面取出到了时间的事件,然后调用event_active_nolock(激活事件并且不阻塞)-->event_queue_insert(将事件插入到相应的队列中)来将取出的到了时间的事件插入到激活队列里面。然后调用event_process_active-->event_process_active_single_queue(处理激活了的事件),event_process_deferred_callbacks(处理延后了的事件,即应该发生在当前时间之前的事件)

在io事件的用法里,peoll或者select的dsipatch函数会将可用文件描述符和base本身以及事件的类型(EV_READ,EV_WRITE)作为参数调用evmap_io_active函数,在evmap_io_active函数中,base通过可用的文件描述符查找自身的io(evmap_io_map类型的变量)得到对应的event,然后将其放到非阻塞激活队列中(通过调用event_active_nolock)
阅读(2623) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~