调用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)
阅读(2743) | 评论(0) | 转发(0) |