libevent源码学习-第三天

来源:互联网 发布:基德职业生涯数据 编辑:程序博客网 时间:2024/04/29 03:55
<event2/event.h> & <event.c>
提供了各个接口函数

void event_enable_debug_mode(void)
打开debug模式,跟踪程序的运行。

该函数会打印出:1,事件重复添加;2,函数在事件添加前执行。
我们需要知道以下几个常用宏:
__func__ ,指明当前执行的函数名;
__FILE__ , 指明当前执行的文件;
__LINE__ , 指明当前执行程序所在的行号。


void event_debug_unassign(struct event*)
debug模式下,不在响应某个事件,作为参数的event必须属于为添加的event。

//以下函数关于libevent的配置
struct event_config* event_config_new(void)
生成一个event_config对象,该对象可以用于改变一个event_base的默认行为

void event_config_free(struct event_config* cfg)
释放一个event_config对象的内存空间

int event_config_avoid_method(struct event_config *cfg, const char *method)
从event_base的配置中屏蔽某种方法(即多路复用机制)。


//以下函数用于创建libevent实例

struct event_base* event_base_new_with_config(struct event_config*);
根据配置生成一个新的event_base对象。

struct event_base* event_base_new(void)
内部调用event_config_new()创建一个新的配置对象,并使用该对象创建一个新的event_base对象。

int event_reinit(struct event_base *base);
重新初始化一个event_base,主要针对的问题是:部分事件机制在fork后无法继承。

struct event_base* event_init(void)
生成一个新的event_base对象,即一个libevent实例,并对该对象进行初始化。实际上,该函数内部是调用了event_base_new_with_config(NULL)。
在默认情况下,libevent内置了一个全局对象current_base作为libevent实例,默认情况下操作的都是current_base。


//以下函数用于注册事件

int event_assign(struct event *, struct event_base *, evutil_socket_t, short, event_callback_fn, void *);
配置一个event事件,完成对于event结构内部成员变量的赋值。

int event_set(struct event *, struct event_base *, evutil_socket_t, short, event_callback_fn, void *);
内部调用event_assign。

struct event *event_new(struct event_base *, evutil_socket_t, short, event_callback_fn, void *);
用于生成一个新的event事件,4个参数分别为ev->ev_base;监听的端口,文件或者信号;监听的事件类型(EV_READ,EV_WRITE);回调函数,回调函数参数。内部调用event_assign执行ev的设置。

int event_add(struct event *ev, const struct timeval* tv)
将事件ev注册到ev->ev_base上,事件类型由ev->ev_events指明。注册成功则ev添加到已注册事件链表中,若tv非空,则同时注册为定时事件,添加到timer堆上。
该函数实际调用了event_add_internal()函数,其执行的基本流程为:
a. 若tv非空,且ev->ev_flags标记有超时事件,在timer heap上分配一个空间,但不赋值。

b. 等待主线程从事件的回调函数中返回。

c. 检测事件是否已经在base的激活事件或者注册事件链表中,若不在则根据事件类型将事件插入到对应的事件链表中。

d. 检测event事件是否在timer heap中,若再则删除旧的并重新添加

e. 检测事件是否已经是激活事件,若是则从激活链表中删除它。

f. 将事件添加到timer heap以及注册时间链表中。


//以下用于释放事件

int event_del(struct event *);
从已注册事件链表中删除一个事件。

void event_free(struct event *);
释放一个event结构,释放前,该事件应该处于非就绪和非激活状态。函数内部调用event_del(),并释放其内存空间。
原创粉丝点击