Libevent 反应堆的初始化
// 默认情况下new eventbase
struct event_base *
event_base_new(void)
{
struct event_base *base = NULL;
//初始化系统配置
struct event_config *cfg = event_config_new(); // 使用默认的配置方法
if (cfg) {
//再利用事件的系统配置去初始化base event
base = event_base_new_with_config(cfg);
event_config_free(cfg);
}
return base;
} event_config 结构如下 struct event_config {
//我们知道libevent 支持很多io模型 select poll epoll devpoll win32等
//这里的entries 是一个队列里面存放着要避免的方法 event_config_entry{ const char *avoid_method, 双向表指针}
TAILQ_HEAD(event_configq, event_config_entry) entries;
//初始化占用cpu个数
int n_cpus_hint;
//反应堆检查事件的间隔
struct timeval max_dispatch_interval;
//指两次事件间隔最多调用事件个数
int max_dispatch_callbacks;
//若优先级别低于它就不会执行上两项
int limit_callbacks_after_prio;
//支持后台方法的特性 如epoll 模型想要采用ET 即EV_FEATURE_ET 还用延迟关闭等选项
enum event_method_feature require_features; enum event_base_config_flag flags;
}; /*
对于event_config的初始化都有相关接口
例如:
entries 不希望采用的后台模型 event_config_avoid_method() 它会将所有要避免的模型加入队列 event_get_supported_method 得到所有避免的模型
event_config_set_num_cpus_hint 设置cpu个数 event_config_set_max_dispatch_interval(struct event_config *cfg,
const struct timeval *max_interval, int max_callbacks,
int min_priority);
详细说明一下:
Record an interval and/or a number of callbacks after which the event base
should check for new events. By default, the event base will run as many
events are as activated at the higest activated priority before checking
for new events. If you configure it by setting max_interval, it will check
the time after each callback, and not allow more than max_interval to
elapse before checking for new events. If you configure it by setting
max_callbacks to a value >= 0, it will run no more than max_callbacks
callbacks before checking for new events.
记录反应堆应该监测新事件时间间隔或者回调函数的个数。 一般来说 反应堆会在检查新事件之前会运行所有的激活的事件。
如果你配置了max_interval, 它会在每次callback之后检查时间, 保证反应堆每次去check新事件的时间间隔不允许超过最大间隔。
设置max_callbacks ,意思就是说每次监测新事件的间隔 最多可以有max_callbacks个回调被执行。 This option can decrease the latency of high-priority events, and
avoid priority inversions where multiple low-priority events keep us from
polling for high-priority events, but at the expense of slightly decreasing
the throughput. Use it with caution!
这个选项能够减少潜在的高优先级事件, 避免低优先级事件阻碍我们及时处理高优先级事件,但是由于处理激活事件受到了限制
它的吞吐量将减小, 小心使用。
@param cfg The event_base configuration object.
@param max_interval An interval after which Libevent should stop running
callbacks and check for more events, or NULL if there should be
no such interval.
@param max_callbacks A number of callbacks after which Libevent should
stop running callbacks and check for more events, or -1 if there
should be no such limit.
min_priority 事件优先级低于它 就不会执行上面俩个参数的设置
0 表示任何优先级都会执行 若是1 就是表示优先级是1或在在1之上就会执行
@param min_priority A priority below which max_interval and max_callbacks
should not be enforced. If this is set to 0, they are enforced
for events of every priority; if it's set to 1, they're enforced
for events of priority 1 and above, and so on.
@return 0 on success, -1 on failure. int event_config_require_features(struct event_config *cfg, int feature);//设置feature
int event_config_set_flag(struct event_config *cfg, int flag);
event_base_config_flag:
这个字段:
enum event_base_config_flag {
/** Do not allocate a lock for the event base, even if we have
locking set up.
Setting this option will make it unsafe and nonfunctional to call
functions on the base concurrently from multiple threads.
*/
//不分配锁 用于是否选择多线程
EVENT_BASE_FLAG_NOLOCK = 0x01,
/** Do not check the EVENT_* environment variables when configuring
an event_base */
//是否监测EVENT_*环境变量
EVENT_BASE_FLAG_IGNORE_ENV = 0x02,
//windows 选项
EVENT_BASE_FLAG_STARTUP_IOCP = 0x04,
/** Instead of checking the current time every time the event loop is
ready to run timeout callbacks, check after each timeout callback.
*/
//在超时callback之后check 当前时间 而不是在准备运行timeout callbacks时
EVENT_BASE_FLAG_NO_CACHE_TIME = 0x08, /** If we are using the epoll backend, this flag says that it is
safe to use Libevent's internal change-list code to batch up
adds and deletes in order to try to do as few syscalls as
possible. Setting this flag can make your code run faster, but
it may trigger a Linux bug: it is not safe to use this flag
if you have any fds cloned by dup() or its variants. Doing so
will produce strange and hard-to-diagnose bugs. This flag can also be activated by setting the
EVENT_EPOLL_USE_CHANGELIST environment variable. This flag has no effect if you wind up using a backend other than
epoll.
*/
//使用changelist 减少系统调用 但是可能是不安全的
EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST = 0x10, /** Ordinarily, Libevent implements its time and timeout code using
the fastest monotonic timer that we have. If this flag is set,
however, we use less efficient more precise timer, assuming one is
present.
*/
//选则计时器
//通常情况下,Libevent将使用最快计时器。 但是如果这个标志被设置,我们使用更低效的更精确的计时器。
EVENT_BASE_FLAG_PRECISE_TIMER = 0x20
};
*/ //默认情况下 产生的event_config
struct event_config *
event_config_new(void)
{
struct event_config *cfg = mm_calloc(, sizeof(*cfg)); if (cfg == NULL)
return (NULL); TAILQ_INIT(&cfg->entries);
cfg->max_dispatch_interval.tv_sec = -;
cfg->max_dispatch_callbacks = INT_MAX;
//优先级低于1的话就不会有上述设置 这里的优先级别越小优先级就越大
//那么这里默认就不使用上述设置
cfg->limit_callbacks_after_prio = ;
return (cfg);
} //根据event config 初始化反应堆
struct event_base *
event_base_new_with_config(const struct event_config *cfg)
{
int i;
struct event_base *base;
int should_check_environment;
。。。。。
根据cfg填充base的各个字段
return (base);
}
Libevent 反应堆的初始化的更多相关文章
- libevent源码深度剖析
原文地址: http://blog.csdn.net/sparkliang/article/details/4957667 第一章 1,前言 Libevent是一个轻量级的开源高性能网络库,使用者众多 ...
- libevent(了解)
1 前言 Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不少.写这一系列文章的用意在于,一则分享心得:二则对libevent代码和设计思想做系统的.更深层次的分析, ...
- libevent 源码分析
1,前言 Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不少.写这一系列文章的用意在于,一则分享心得:二则对libevent代码和设计思想做系统的.更深层次的分析, ...
- libevent功能使用简介
http://blog.csdn.net/happyanger6/article/details/7272324 1. 介绍 libevent是一个用来开发可扩展的网络服务器的事件通知函数库.当一个文 ...
- libevent的作用或者说是有哪些功能
1. 介绍 libevent是一个用来开发可扩展的网络服务器的事件通知函数库.当一个文件描述符上的特定事件发生或是一个超时时间到达后,libevent API提供一种执行回调函数的机制.而且,libe ...
- libevent源码深度剖析八
libevent源码深度剖析八 ——集成信号处理 张亮 现在我们已经了解了libevent的基本框架:事件管理框架和事件主循环.上节提到了libevent中I/O事件和Signal以及Timer事件的 ...
- 示例的libevent的程序
著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:auxten 链接:http://zhuanlan.zhihu.com/auxten/20315482 来源:知乎 /* ...
- Windows下libevent C++封装类实现(为什么要使用封装好的网络库?)
题记 windows平台下对于服务器高并发的网络模型选型中,使用libevent是个不错的选择. 本文的背景基于:国内博客对于libevent大多介绍linux实现,大多是c语言的实现,Windows ...
- Windows下libevent C++封装类实现
题记 windows平台下对于服务器高并发的网络模型选型中,使用libevent是个不错的选择. 本文的背景基于:国内博客对于libevent大多介绍linux实现,大多是c语言的实现,Windows ...
随机推荐
- oracle建表权限问题和JSP连接oracle数据库基本操作
JSP连接oracle数据库相关操作 1.创建表 打开Enterprise Manager Console,为用户添加权限CREATE ANY TABLE和分配一定的表空间USERS限额1024k. ...
- ueditor编辑器插件 chrome中图片上传框延时问题
最近在项目中使用ueditor插件进行文字的在线编辑功能时,发现这个插件的图片上传弹框在chrome浏览器延迟非常的厉害.经过多方搜索,终于解决.现将解决方案记录如下: 1.修改/Ueditor/di ...
- ng-options指令语法
ng-options一般有以下用法 对于数组: label for value in array select as label for value in array label group by g ...
- 最最简单的CentOs6在线源搭建
非常实用的在线源搭建,只要4步骤 1.点击进入http://mirrors.aliyun.com/repo/epel-6.repo ,这是阿里云的源 2.复制所有的代码 ctrl+a,ctrl+c ...
- Python pip 下载速度慢? Windows 设置 国内源,用 阿里云 国内镜像 加速
pip 提供了对 Python 包的查找.下载.安装.卸载的功能,是非常方便的 Python 包管理工具.但是,令人苦恼的是 pip 在国内的下载速度非常慢,速度常常只有每秒几十 K,甚至才几 K,小 ...
- web前端学习路线和步骤
H5+全栈工程师 (学习下列技术可以加QQ: 1416 7596 61)第一阶段:初级入门阶段基本功 1.HTML入门 Windows概述.浏览器概述.HTML简介.HTML标签详解.前端开发工具概 ...
- Thinkphp5 模型 验证器执行顺序问题
Thinkphp5把模型的验证规则归为一个验证器,这种做法,不知到符不符合大家的心意,反正楼主是比较不爽的 楼主更倾向于tp3.2的验证规则直接写在模型里面,毕竟你的验证规则一般而言是针对模型来验证的 ...
- python中pygame模块的Linux下安装过程
一.使用pip安装Python包 大多数较新的Python版本都自带pip,因此首先可检查系统是否已经安装了pip.在Python3中,pip有时被称为pip3. 1.在Linux和OS X系统中检查 ...
- JavaScript系列----函数(Function)篇(4)
1.什么是函数? 在W3C中函数的定义是这么说的:函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 诚然,从这种抽象的定义中我们得不到什么有价值的东西.下面,举例来列举出函数的几种定义 ...
- 【1】maven来管理我的SSM项目
新建个maven项目,第一步当然是配置好自己需要的jar包,maven使用pom.xml管理 并不是每一个都有用,但是都是常见jar,方便以后自己调用来查找 <project xmlns=&qu ...