几个重要的结构体定义:
struct event_base {
const struct eventop *evsel;/*事件驱动模型入口,在event_init函数中确定事件驱动模型*/
void *evbase;/*对应事件驱动模型实现相关属性参数*/
int event_count; /* counts number of total events */
int event_count_active; /* counts number of active events */
int event_gotterm; /* Set to terminate loop */
int event_break; /* Set to terminate loop immediately */
/* active event management */
struct event_list **activequeues;/*多个活动事件链表实现优先级*/
int nactivequeues;/*活动链表个数*/
/* signal handling info */
struct evsignal_info sig;
struct event_list eventqueue;/*检测触发被处理的事件队列*/
struct timeval event_tv;/*事件时间*/
struct min_heap timeheap;/*时间事件定时器堆*/
struct timeval tv_cache;/*时间缓冲变量*/
};
event_base对象整合了事件处理的一些全局变量,角色是event对象的"总管家",他包括了事件引擎函数对象(evsel, evbase), 当前入列事件列表(event_count,event_count_active, eventqueue), 全局终止信号(event_gotterm), 活跃事件列表(avtivequeues,nactivequeues), 时间事件定时器堆(timeheap)
其中event_init()函数主要是对event_base对象进行初始化,选择当前OS支持的事件引擎模型(evport,kqueue,epoll,devpoll,rtsig,poll,select),创建全局信号队列(evsigevents[NSIG],NSIG为65),活动队列内存分配(个数为nactivequeues,默认为1)
事件对象结构体定义:
struct event {
TAILQ_ENTRY (event) ev_next;
TAILQ_ENTRY (event) ev_active_next;
TAILQ_ENTRY (event) ev_signal_next;
unsigned int min_heap_idx; /* for managing timeouts */
struct event_base *ev_base;
int ev_fd;
short ev_events;
short ev_ncalls;
short *ev_pncalls; /* Allows deletes in callback */
struct timeval ev_timeout;
int ev_pri; /* smaller numbers are higher priority */
void (*ev_callback)(int, short, void *arg);
void *ev_arg;
int ev_res; /* result passed to event callback */
int ev_flags;
};
event_set()函数是用来设置event对象,包括所有者event_base对象, fd, 事件(EV_READ| EV_WRITE), 回掉函数和参数,事件优先级是当前event_base的中间级别(current_base->nactivequeues/2)
event_add()函数是用来添加事件的
int event_add(struct event *ev, struct timeval *tv)
这个接口有两个参数, 第一个是要添加的事件, 第二个参数作为事件的超时值(timer). 如果该值非NULL, 在添加本事件的同时添加超时事件(EV_TIMEOUT)到时间队列树(timetree), 根据事件类型处理如下:
EV_READ => EVLIST_INSERTED => eventqueue
EV_WRITE => EVLIST_INSERTED => eventqueue
EV_TIMEOUT => EVLIST_TIMEOUT => timetree
EV_SIGNAL => EVLIST_SIGNAL => signalqueue
另外信号处理也比较巧妙,通过管道通信来实现
第一次添加信号处理事件的时候会添加信号常驻事件,其中fd句柄就是管道的另一端
信号事件添加时候会在管道的一端向管道发送一个字符“a”,事件驱动模型就检测fd句柄中有可读事件发生,然后recv触发evsignal_process进行处理调用event_active把信号事件插入到活动事件队列里(EVLIST_ACTIVE)进行处理
分享到:
相关推荐
libevent框架源码分析 分析所依赖的基础知识 IO模型 同步I / O 初步I / O IO复合 并发模型 同步 初步 同步线程/异步线程/半同步/半同步 半同步/半React堆/ 前摄器半同步/半异步高效模式 并发编程 多进程 进度组 ...
libevent是非常著名的开源网络库,可以作为服务端开发入门研究资料
libevent多线程处理的一种实现方式,学习libevent后自己实现的记录
1前言132 源代码组织结构133 小结143 事件设置的接口函数174 小结18六 初见事件处理框架193 接口函数204 小节23七 事件主循环241 阶段
作者连接为http://blog.csdn.net/luotuo44/article/category/2435521/2 本人为方便今后的学习和记录,将网页内容复制做成PDF文档,希望作者不要介意
libevent库,文字版,很清晰,附带libevent参考手册(中文版) libevent源码深度剖析,根据libevent开源代码框架进行剖析,很不错值得学习借鉴,还有libevent中C语言的功底值得学习揣摩!
c++版本libevent,仿照libevent写的一个服务器框架,libevent的基本功能已实现,暂时不能在windows平台上使用,定时器是纯粹的timer wheel方式,与libevent的小根堆不一样,而且最大定时时间是固定的,暂时不支持...
Libevent 基于事件的
一个基于 Libevent 和 protobuf的C++服务器框架 采用面向对象的思想将libevent2.0.22封装为c++,消息通过protobuf进行消息序列号和反序列化 有mysql数据库读写方法。 附带一个客户端能够直接链接,有文件传输和消息...
qt_eventdispatcher_libevent 是基于 Libevent 的 Qt 事件调度器 特点 非常快速 支持Qt4和Qt5 不需要Qt的私有头文件 通过Qt4 和 Qt5 的事件调度,事件循环,...
为方便阅读,把blog上的libevent源码深度剖析系列文章整合成一个pdf。
LibEvent定时器事件开发实例
Libevent分析笔记
libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。著名分布式缓存软件memcached也是libevent based,而且libevent在使用上可以做到跨...
在linux下C语言通过libevent操作串口,通过libevent来实现回调读取串口数据。全部C代码,可直接编译和测试。
libevent是一个异步事件处理软件库。libevent是一个提供异步事件通知的软件库。
libevent参考手册(中文版),包含libevent的设计说明、原理描述,模块介绍和接口说明。
Libevent_Analysis:Libevent网络框架源代码分析
最新的libevent中文参考手册; Libevent 是用于编写高速可移植非阻塞 IO 应用的库,其设计目标是: 可移植性:使用 libevent 编写的程序应该可以在 libevent 支持的所有平台上工作。即使 没有好的方式进行非阻塞 IO...