源码分析

一般来说,是主线程执行event_base_dispatch函数。本文也是如此,如无特别说明,event_base_dispatch函数是由主线程执行的。 notify的理由: ? ? ? ? 本文要说明的问题是,当主线程在执行event_base_dispatch进入多路IO复用函数时,会处于休眠状态,休眠前解锁。此时,其他线
dexcoder 1年前发布
信号event的工作原理: ? ? ? ??前面讲解了Libevent怎么对一个IO事件进行监听,现在来讲一下Libevent怎么监听信号。Libevent对于信号的处理是采用统一事件源的方式。简单地说,就是把信号也转换成IO事件,集成到Libevent中。 ? ? ? ? 统一事件源的工作原理是这样的:假如用户
dexcoder 1年前发布
?event_base允许用户对它里面的event设置优先级,这样可以使得有些更重要的event能够得到优先处理。 ? ? ? ? Libevent实现优先级功能的方法是:用一个激活队列数组来存放激活event。即数组的元素是一个激活队列,所以有多个激活队列。并且规定不同的队列有不同的优先级。 ? ?
dexcoder 1年前发布
之前的博文讲了很多Libevent的基础构件,现在以一个实际例子来初步探究Libevent的基本工作流程。由于还有很多Libevent的细节并没有讲所以,这里的探究还是比较简洁,例子也相当简单。 #include<unistd.h> #include<stdio.h> #include<event.h> #include&
dexcoder 1年前发布
之前的博文讲了怎么实现线程、锁、内存分配、日志等功能的跨平台。Libevent最重要的跨平台功能还是实现了多路IO接口的跨平台(即Reactor模式)。这使得用户可以在不同的平台使用统一的接口。这篇博文就是来讲解Libevent是怎么实现这一点的。 ? ? ? ??Libevent在实现线程、内存分
dexcoder 1年前发布
?前面的博文都是讲一些Libevent的一些辅助结构,现在来讲一下关键结构体:event_base。 ? ? ? ??这里作一个提醒,在阅读Libevent源码时,会经常看到backend这个单词。其直译是“后端”。实际上其指的是Libevent内部使用的多路IO复用函数,多路IO复用函数就是select、poll、epo
dexcoder 1年前发布
相关结构体: ? ? ? ? ? ? ? ??因为event_signal_map结构体实在太简单了,所以不像event_io_map那样,有一个专门的文件。由于没有专门的文件,那么只能从蛛丝马迹上探索这个event_signal_map结构了。 ? ? ? ??通过一些搜索,可以得到与event_signal_map相关联的一些结构体有下
dexcoder 1年前发布
上一篇博客说到了TAILQ_QUEUE队列,它可以把多个event结构体连在一起。是一种归类方式。本文也将讲解一种将event归类、连在一起的结构:哈希结构。 哈希结构体: ? ? ? ? 哈希结构由下面几个结构体一起配合工作: struct event_list { struct event *tqh_first; st
dexcoder 1年前发布
?Libevent源码中有一个queue.h文件,位于compat/sys目录下。该文件里面定义了5个数据结构,其中TAILQ_QUEUE是使得最广泛的。本文就说一下这个数据结构。 队列结构体: ? ? ? ??TAILQ_QUEUE由下面两个结构体一起配合工作。 #define TAILQ_HEAD(name, type) \ struct name
dexcoder 1年前发布
Debug锁操作: ? ? ? ?? ? ? ??Libevent还支持对锁操作的一些检测,进而捕抓一些典型的锁错误。Libevent检查: 解锁自己(线程)没有持有的锁 在未解锁前,自己(线程)再次锁定一个非递归锁。 ? ? ? ??Libevent通过一些变量记录锁的使用情况,当检查到这些锁的错误使用时,就调用
dexcoder 1年前发布
Libevent提供给用户的可见多线程API都在thread.h文件中。在这个文件提供的API并不多。基本上都是一些定制函数,像前面几篇博文说到的,可以为Libevent定制用户自己的多线程函数。 开启多线程: ? ? ? ? Libevent默认是不开启多线程的,也没有锁、条件变量这些东西。这点和前面
dexcoder 1年前发布
Libevent的内存分配函数还是比较简单的,并没有定义内存池之类的东西。如同前一篇博客那样,给予Libevent库的使用者充分的设置权(定制),即可以设置用户(Libevent库的使用者)自己的内存分配函数。至于怎么分配,主动权在于用户。但在设置(定制)的时候要注意一些地方,下面会说
dexcoder 1年前发布
日志处理: ? ? ? ??在Libevent的源码中,经常会见到形如event_warn、event_msgx、event_err之类的函数。这通常出现在代码中一些值是不合理时。这些函数就是Libevent的日志函数。它能把这些不合理的情况打印出来,告知用户。 定制日志回调函数: ? ? ? ? Libevent在默认情况下
dexcoder 1年前发布
如果你打开Libevent的一些文件,比如util.h文件。就会发现使用了很多宏定义,并根据一些宏定义而进行条件编译。这些宏定义往往来自event-config.h文件中。 ? ? ? ? 如util.h文件的代码开始处: #ifdef _EVENT_HAVE_SYS_TIME_H #include <sys/time.h> #endif #ifdef _
dexcoder 1年前发布
? ? ? ? 我所分析的Libevent版本是2.0.21版本,是目前最新的稳定版本。看这系列博文中,需要读者有Linux编程的一些基础。因为像POSIX、文件描述符、多线程等等这些概念,我并不会去解释,我默认读者已经熟悉这些概念了。如果读者读过《UNIX环境高级编程》,那就完全没问题了。
dexcoder 1年前发布
RegexExtractorInterceptor作为一个Interceptor实现类可以根据一个正则表达式匹配event body来提取字符串,并使用serializers把字符串作为header的值实例:以如下的命令使用execsource收集日志的时候,可以根据文件的名称设置不同的header,进行不同的操作 #!/bin/sh filenam
dexcoder 1年前发布
本篇博客是我加入Android 开源项目源码解析分析的一篇文章,初次加入,所以选了个比较简单的库,如果你曾经看过Android 快速开发系列 打造万能的ListView GridView 适配器对本篇博客就不会太陌生, base-adapter-helper就是完成类似万能适配器的功能,当然了它本身不支持多种I
dexcoder 1年前发布
在开发移动应用程序的时候用到动画是家常便饭的事,但是你有没有想过它是怎么实现的呢?今天小弟就在此分析一下。 1 startAnimation 方法。 ?设置好animation变量,刷新父视图绘画缓存。 /** * Start the specified animation now. * * @param animation th
dexcoder 1年前发布