libevent源码分析

来源:互联网 发布:wampserver mysql密码 编辑:程序博客网 时间:2024/06/05 18:56
使用libevent的最基本的步骤:
1.创建event_base
2.创建相应的event
3.添加event
4.启动事件循环
下面通过简单例子:
#include<sys/types.h>
#include<stdio.h>
#include<event2/event.h>

void timerCallBack(evutil_socket_t fd,short event,void *arg)
{
    printf("time out call\n");
}

int main()
{
    struct event_base *base = event_base_new();
    if(!base)
    {
 printf("create event base fail\n");
 return 0;
    }
    struct event *eventobj = evtimer_new(base,timerCallBack,NULL);
    struct timeval tv;
    tv.tv_sec = 5;
    tv.tv_usec = 0;
    event_add(eventobj,&tv);
    printf("timer begin \n");
    event_base_dispatch(base);
    if(base)
    {
    event_base_free(base);
     printf("free event base \n");
    }
    if(eventobj)
    {
     event_free(eventobj);
     printf("free event \n");
    }
    return 0;
}

当然,如果我们不行new 一个event_base 和event对象,还要另外一种写法

int main()
{
    struct event_base *base = event_init();
   struct event eventobj ;
   struct timeval tv;
   tv.tv_sec = 5;
   tv.tv_usec = 0;
   evtimer_assign(&eventobj,base,timerCallBack,NULL);
   event_add(&eventobj,&tv);
   printf("timer begin \n");
   event_dispatch();
   return 0;
}
首先,我们来看看后面这种写法,使用了event_init和event_dispatch。看这两个函数干些什么事情。
先看看event_init
struct event_base *event_init(void)
{
 struct event_base *base = event_base_new_with_config(NULL);   //new 一个event_base
 if (base == NULL) 
{
  event_errx(1, "%s: Unable to construct event_base", __func__);
  return NULL;
 }
 current_base = base;    // current_base 是一个宏,指向一个全局的event_base,定义如下
 return (base);  
}
struct event_base *event_global_current_base_ = NULL;
#define current_base event_global_current_base_
接下来看看event_dispatch的实现
int  event_dispatch(void)
{
 return (event_loop(0));
}
int  event_loop(int flags)
{
 return event_base_loop(current_base, flags);   //使用的参数current_base ,就是event_init赋值之后的。
                                                                             //所以要用event_dispatch启动事件循环,就要确保current_base 是不为NULL
}
event_base_dispatch的实现就好理解了
int  event_base_dispatch(struct event_base *event_base)
{
 return (event_base_loop(event_base, 0));
}

这里有个问题,event_init是new了一个event_base,这个最终是需要free掉才行的,不然肯定会有内存泄漏。如果我们忘了记下这个event_base,怎么free呢。其实给event_base_free传入NULL参数就可以了。
以下是event_base_free的部分实现代码。
void  event_base_free(struct event_base *base)
{
 int i, n_deleted=0;
 struct event *ev;

 if (base == NULL && current_base)    //如果我们传入NULL,把current_base赋值给base,后面就把base释放,达到了目的。
  base = current_base;
 if (base == current_base)
  current_base = NULL;
 if (base == NULL) {
  event_warnx("%s: no base to free", __func__);
  return;
 }
。。。。。。。。

1 0
原创粉丝点击