libevent源码学习-第一天
来源:互联网 发布:摇头岭车神淘宝店地址 编辑:程序博客网 时间:2024/04/29 07:49
<event2/struct_event>
定义了<event.h>所需要的数据结构:struct event
#define TAILQ_ENTRY(type)
struct {
struct type *tqe_next;
struct type *tqe_pre;
}
#endif
可以指向任意类型的的一个双向列表节点,避免用户使用头文件<sys/queue.h>
libevent通过双向链表管理全部的事件,包括三个链表结构:I/O事件链表,保存I/O事件;激活事件链表,保存所有的激活事件,libevent通过遍历该链表执行调度;Signal事件列表,保存所有的信号事件。
struct event{
TAILQ_ENTRY(event) ev_active_next;
TAILQ_ENTRY(event) ev_next;
union{
TAILQ_ENTRY(event) ev_next_with_common_timeout;
int min_heap_idx;
}ev_timeout_pos;
evutil_socket_t ev_fd;
struct{
TAILQ_ENTRY(event) ev_io_next;
struct timeval ev_timeout;
}ev_io;
struct{
TAILQ_ENTRY(event) ev_signal_next;
short ev_ncalls;
short* ev_pncalls;
}ev_signal;
}_ev;
short ev_events;
short ev_res;
short ev_flags;
ev_uint8_t ev_pri;
ev_unit8_t ev_closure;
struct timeval ev_timeout;
void (*ev_callback)(evutil_socket_t, short, void* arg);
void *ev_arg;
};
1. ev_next 和 ev_active_next
双向链表节点指针,ev_next指定当前I/O事件在“已注册事件链表”中的位置;ev_active_next指明当前事件在“激活事件链表”中的位置。
2. ev_timeout_pos(猜测)
用于管理超时事件,ev_next_with_common_timeout为事件在超时链表中的位置;min_heap_idx为其在管理超时事件的小根堆中的索引,当事件为超时事件时使用。
3. ev_fd
用于保存事件所对应的端口、文件句柄。对于I/O事件,其为绑定的文件描述符;对于signal事件,为绑定的信号。
4. ev_base
指明该事件所属的反应堆实例,每个base实际上是一个libevent实例。
5. _ev
第一个结构体由I/O事件使用,第二个结构体由signal事件使用。
6. ev_events
指定event关注的事件类型,可以是:I/O事件(EV_WRITE & EV_READ);定时事件(EV_TIMEOUT);signal事件(EV_SIGNAL);永久事件(EV_PERSIST)。
7. ev_res
传递给回调函数获取返回值
8. ev_flags
用于标记当前事件的状态,可能值:event在time堆中(EVLIST_TIMEOUT=0X01);event在已注册事件链表中(EVLIST_INSERTED=0X02);event在signal事件链表中(EVLIST_SIGNAL=0X04);event在激活链表中(EVLIST_ACTIVE=0X08);内部使用标记(EVLIST_INTERNAL=0X10);event已被初始化(EVLIST_INIT=0X80)。
9. ev_timeout
事件的超时值
10. ev_callback
event的回调函数,由ev_base调用,执行事件处理,其参数对应结构体中的ev_fd, ev_events,和arg
11. ev_arg
任意数据类型,作为ev_callback的输入参数,在设定event时指定。
12. ev_pri
指明事件的优先级,越小优先级越高。
该文件中同时包括事件的头指针结构
#define TAILQ_HEAD(name, type)
struct name{
struct type *tqh_first;
struct type **tqh_last;
}
定义了<event.h>所需要的数据结构:struct event
#define TAILQ_ENTRY(type)
struct {
struct type *tqe_next;
struct type *tqe_pre;
}
#endif
可以指向任意类型的的一个双向列表节点,避免用户使用头文件<sys/queue.h>
libevent通过双向链表管理全部的事件,包括三个链表结构:I/O事件链表,保存I/O事件;激活事件链表,保存所有的激活事件,libevent通过遍历该链表执行调度;Signal事件列表,保存所有的信号事件。
struct event{
TAILQ_ENTRY(event) ev_active_next;
TAILQ_ENTRY(event) ev_next;
union{
TAILQ_ENTRY(event) ev_next_with_common_timeout;
int min_heap_idx;
}ev_timeout_pos;
evutil_socket_t ev_fd;
struct event_base* ev_base;
union{struct{
TAILQ_ENTRY(event) ev_io_next;
struct timeval ev_timeout;
}ev_io;
struct{
TAILQ_ENTRY(event) ev_signal_next;
short ev_ncalls;
short* ev_pncalls;
}ev_signal;
}_ev;
short ev_events;
short ev_res;
short ev_flags;
ev_uint8_t ev_pri;
ev_unit8_t ev_closure;
struct timeval ev_timeout;
void (*ev_callback)(evutil_socket_t, short, void* arg);
void *ev_arg;
};
1. ev_next 和 ev_active_next
双向链表节点指针,ev_next指定当前I/O事件在“已注册事件链表”中的位置;ev_active_next指明当前事件在“激活事件链表”中的位置。
2. ev_timeout_pos(猜测)
用于管理超时事件,ev_next_with_common_timeout为事件在超时链表中的位置;min_heap_idx为其在管理超时事件的小根堆中的索引,当事件为超时事件时使用。
3. ev_fd
用于保存事件所对应的端口、文件句柄。对于I/O事件,其为绑定的文件描述符;对于signal事件,为绑定的信号。
4. ev_base
指明该事件所属的反应堆实例,每个base实际上是一个libevent实例。
5. _ev
第一个结构体由I/O事件使用,第二个结构体由signal事件使用。
6. ev_events
指定event关注的事件类型,可以是:I/O事件(EV_WRITE & EV_READ);定时事件(EV_TIMEOUT);signal事件(EV_SIGNAL);永久事件(EV_PERSIST)。
7. ev_res
传递给回调函数获取返回值
8. ev_flags
用于标记当前事件的状态,可能值:event在time堆中(EVLIST_TIMEOUT=0X01);event在已注册事件链表中(EVLIST_INSERTED=0X02);event在signal事件链表中(EVLIST_SIGNAL=0X04);event在激活链表中(EVLIST_ACTIVE=0X08);内部使用标记(EVLIST_INTERNAL=0X10);event已被初始化(EVLIST_INIT=0X80)。
9. ev_timeout
事件的超时值
10. ev_callback
event的回调函数,由ev_base调用,执行事件处理,其参数对应结构体中的ev_fd, ev_events,和arg
11. ev_arg
任意数据类型,作为ev_callback的输入参数,在设定event时指定。
12. ev_pri
指明事件的优先级,越小优先级越高。
该文件中同时包括事件的头指针结构
#define TAILQ_HEAD(name, type)
struct name{
struct type *tqh_first;
struct type **tqh_last;
}
#endif
TAILQ_HEAD(event_list, event);- libevent源码学习-第一天
- libevent源码学习-第三天
- Struts2源码学习--第一天
- 学习android源码第一天
- Libevent源码学习---bufferevent
- libevent源码学习研究(libevent-0.1)
- JBPM源码-第一天
- 第一天阅读源码
- libevent源码学习-第二天
- libevent源码学习-第四天
- libevent源码学习-----Reactor模型
- libevent源码学习-----阅读心得
- libevent源码学习-----时间管理
- libevent源码学习-----event操作
- libevent学习之一:libevent源码的特点和结构
- struts2源码阅读第一天
- 学习第一天
- 学习.net第一天
- static 的作用
- 程序员从体验儿童英语图解学习词典中得到的启示
- 东软实训总结
- 如何搭建本地的PIP源提高Devstack和venv环境的安装速度
- 黑马程序员——.NET自学课程第三天笔记
- libevent源码学习-第一天
- SGU 231. Prime Sum 素数打表
- C#学习系列之委托的异步调用
- Linux入门
- C#学习系列之多线程传递参数
- hdu Monky and banana
- 索引顺序表查找
- quartz表达式
- newguy