libevent源码分析

使用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;
 }
。。。。。。。。

luotuo44是一个GitHub上的开源项目,其主要目的是分析libevent源码。libevent是一个使用C语言编写的事件驱动库,可以用于开发高性能的网络服务器和客户端应用程序。 在分析libevent源码时,luotuo44首先研究了libevent的基本结构和使用方法。他深入研究了libevent的事件循环机制、事件触发方式以及事件回调函数的实现原理。通过仔细阅读源代码,他详细解释了libevent是如何利用系统底层的IO多路复用技术(如select、epoll等)来实现高效的事件处理。 此外,luotuo44还分析了libevent的缓冲区管理和事件优先级处理机制。他对libevent的缓冲区数据结构和操作进行了详细解读,包括如何实现缓冲区的读写以及缓冲区事件的触发和处理。他还深入探讨了libevent的事件优先级机制,介绍了如何设置和管理不同优先级的事件,并解释了事件优先级对事件处理效率的影响。 除了基本功能外,luotuo44还分析了libevent的线程安全性和性能优化策略。他详细讲解了libevent的线程安全机制,包括互斥锁、条件变量等,并提供了一些最佳实践指南,以确保多线程环境下的稳定性和性能。此外,他还分享了一些他自己的性能优化经验,包括使用合适的数据结构、避免频繁内存分配与释放等。 总的来说,luotuo44的libevent源码分析为那些想深入了解libevent内部原理和如何正确使用libevent的开发者提供了很大的帮助。通过他的分析,读者可以更好地理解libevent的工作原理,并从中学习到一些编程技巧和优化策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值