【转载】libevent核心数据结构
来源:互联网 发布:一天一包烟 烟瘾 知乎 编辑:程序博客网 时间:2024/05/29 16:36
转载自 libevent核心数据结构
event
event就是每一个需要处理的事件。
struct event { //TAILQ_ENTRY:双向链表。用双向链表保存IO和信号事件 TAILQ_ENTRY (event) ev_next; //IO事件双向链表中位置 TAILQ_ENTRY (event) ev_active_next; //活跃的事件在活跃双向链表中位置 TAILQ_ENTRY (event) ev_signal_next; //信号事件在双向链表中的位置 //时间事件用最小堆管理;下面表示该事件在最小堆的位置。最小堆位置:array的index unsigned int min_heap_idx; /* for managing timeouts */ struct event_base *ev_base; //该事件属于的base int ev_fd; //IO套接字或者信号事件 short ev_events; //事件类型:IO或者定时或者信号num short ev_ncalls; //事件发生后,调用回调函数的次数,通常只调用1次 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; //事件当前状态 ;拥有的状态见下};
#define EVLIST_TIMEOUT 0x01 // event在time堆中 #define EVLIST_INSERTED 0x02 // event在已注册事件链表中 #define EVLIST_SIGNAL 0x04 // 未见使用 #define EVLIST_ACTIVE 0x08 // event在激活链表中 #define EVLIST_INTERNAL 0x10 // 内部使用标记 #define EVLIST_INIT 0x80 // event已被初始化
libevent对event的管理
每次当有事件event转变为就绪状态时,libevent就会把它移入到active event list[priority]中,其中priority是event的优先级;
接着libevent会根据自己的调度策略选择就绪事件,调用其cb_callback()函数执行事件处理;并根据就绪的句柄和事件类型填充cb_callback函数的参数。
event_base:管理所有的event
struct event_base { //evsel和evbase的关系可以理解为evsel->add(evbase, event);//struct eventop见下端代码 const struct eventop *evsel; //指向select或epoll或poll等等中的一个 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 */ //活跃的事件;指针的指针 activequeues[priority] struct event_list **activequeues; int nactivequeues; //活跃事件的数量 /* signal handling info */ struct evsignal_info sig; //管理信号的结构体 struct event_list eventqueue; //I0和信号事件的链表;在2.0版本中IO和信号拆分成两个链表 struct timeval event_tv; //用于事件管理 struct min_heap timeheap; //管理所有定事件的小根堆 struct timeval tv_cache; //用于事件管理};
struct eventop { const char *name; void *(*init)(struct event_base *); // 初始化 int (*add)(void *, struct event *); // 注册事件 int (*del)(void *, struct event *); // 删除事件 int (*dispatch)(struct event_base *, void *, struct timeval *); // 事件分发 void (*dealloc)(struct event_base *, void *); // 注销,释放资源 /* set if we need to reinitialize the event base */ int need_reinit;};
0 0
- 【转载】libevent核心数据结构
- libevent源代码分析--libevent核心event
- libevent源代码分析--libevent核心event
- 【转载】Libevent源码解析
- 转载:libevent安装总结
- 【转载】libevent简单流程
- libevent主要数据结构
- libevent中的基本数据结构
- Libevent数据结构分析
- libevent数据结构-TAILQ_QUEUE队列
- libevent数据结构尾队列
- libevent---核心event和event_base
- Libevent分解之数据结构List
- Libevent分解之数据结构SimpleQueue
- Libevent分解之数据结构Tailqueue
- Libevent分解之数据结构Circlequeue
- Libevent分解之数据结构 哈希表
- libevent分解之数据结构 小根堆
- httpd + subversion SVN服务器搭建
- 微信开发中的snsapi_base与snsapi_userinfo及静默授权的实现
- linux字符设备驱动-同步互斥阻塞笔记
- mysql分表和表分区详解
- PAT-A1117
- 【转载】libevent核心数据结构
- 【Mybatis】深入浅出Mybatis(六)——mapper代理方法使用
- ElasticSearch嵌套模型基本操作
- PAT-A1110
- 函数参数按引用传递和按值传递对动态联编的影响
- PAT-A1113
- makefile实现多目录文件编译
- 算法第四版学习笔记
- PAT-A1111