一起读读libevent的源代码:Libevent 第二章 创建Event base (1)

在您可以使用任何有趣的libevent函数,需要分配一个或多个event_base结构。每个event_base结构持有一组事件,可以poll决定哪些事件是激活的。

如果一个event_base设置使用lock,可以访问多个线程之间。然而,它的循环只能在单个线程中运行。如果你想有多个线程轮询IO,你需要为每个线程一个event_base。

支持一下的方法来进行决定哪个是激活的:

  • select
  • poll
  • epoll
  • kqueue
  • devpoll
  • evport
  • win32

用户可以禁用特定的后端(上面的方法就称为backend)与环境变量。如果你想关闭kqueue后端,设置event_nokqueue环境变量( EVENT_NOEPOLLEVENT_NOKQUEUE, EVENT_NODEVPOLL, EVENT_NOPOLL or EVENT_NOSELECT, ),等等.

EVENT_SHOW_METHOD 可以显示有哪些 kernel notification method 。

如果你想在程序里面关闭某个后端, 可以查看这个函数:event_config_avoid_method

1137 int
1138 event_config_avoid_method(struct event_config *cfg, const char *method)
1139 {
1140     struct event_config_entry *entry = mm_malloc(sizeof(*entry));
1141     if (entry == NULL)
1142         return (-1);
1143
1144     if ((entry->avoid_method = mm_strdup(method)) == NULL) {
1145         mm_free(entry);
1146         return (-1);
1147     }
1148
1149     TAILQ_INSERT_TAIL(&cfg->entries, entry, next);
1150
1151     return (0);
1152 }

这个函数,就是要把这个避免配置 struct event_config_entry 插入 struct event_config 的队列里面:查看下这两个结构体的定义,大概猜想就是创建一个event_base的时候,会使用这些配置文件,所以只要设置如就可以避免使用这些后段方法吧?

0357 /** Internal structure: describes the configuration we want for an event_base
0358  * that we‘re about to allocate. */
0359 struct event_config {
0360     TAILQ_HEAD(event_configq, event_config_entry) entries;
0361
0362     int n_cpus_hint;
0363     struct timeval max_dispatch_interval;
0364     int max_dispatch_callbacks;
0365     int limit_callbacks_after_prio;
0366     enum event_method_feature require_features;
0367     enum event_base_config_flag flags;
0368 };

0351 struct event_config_entry {
0352     TAILQ_ENTRY(event_config_entry) next;
0353
0354     const char *avoid_method;
0355 };


Setting up a default event_base

接口:

Interface
struct event_base *event_base_new(void);

函数的

时间: 2024-11-08 23:36:46

一起读读libevent的源代码:Libevent 第二章 创建Event base (1)的相关文章

[Effective Java 读书笔记] 第二章 创建和销毁对象 第一条

第二章  创建和销毁对象 第一条 使用静态工厂方法替代构造器,原因: 静态工厂方法可以有不同的名字,也就是说,构造器只能通过参数的不同来区分不同的目的,静态工厂在名字上就能表达不同的目的 静态工厂方法不用每次调用的时候都创建新的对象(其实是因为它是static的,所以只能用static的,所以是一早就创建了,不需要重复创建吧..),比如书中 Boolean.valueOf(boolean) 1 public static final Boolean TRUE = new Boolean(true

第二章 创建对话框

1.子类化QDialog 第一个例子是完全使用C++编写的Find对话框. finddialog.h: 1 #ifndef FINDDIALOG_H 2 #define FINDDIALOG_H 3 4 #include <QDialog> 5 6 class QCheckBox; 7 class QLabel; 8 class QLineEdit; 9 class QPushButton; 10 11 class FindDialog : public QDialog 12 { 13 Q_O

[Effective Java]第二章 创建和销毁对象

第一章      前言 略... 第二章      创建和销毁对象 1.            考虑用静态工厂方法代替构造器 创建对象方法:一是最常用的公有构造器,二是静态工厂方法.下面是一个Boolean的简单示例: public static Boolean valueOf(boolean b) { return (b ? Boolean.TRUE : Boolean.FALSE); } l  静态工厂方法与构造器不同的第一大优势在于,它们有名称. 作用不同的公有构造器只能通过参数来区别(因

Effective java 第二章创建和销毁对象 读书笔记

建和销毁对象 一般有两种方式,一种是获得本身的实例,最常用的方法就是提供一个共有的构造器.第二个方法是,类可以提供一个共有的静态工厂方法. 静态工厂方法与构造器不同的三大优势: 有名字: 调用时不用创建新的对象: 返回原来类型的任何子类型对象. 第四大优势: 在创建参数化类型实例的时候,它们使代码变得更加简洁. 服务提供者框架 三个组件: 服务接口 提供者主持API 服务访问API 可选: 服务提供者接口 静态工厂方法的缺点: 类如果不含共有的或者受保护的构造器,就不能被子类化: 它们与其他的静

评论设置----第二章:创建和管理内容

点击“保存并继续出版”按钮. Drupal将保存的内容项,现在该项目将 出现在主导航菜单上,用按字母顺序排列的菜单项.缺省情况下,菜单项 按字母顺序排序;你可以通过菜单管理工具更改排序顺序哪些 在第8章中讨论在这种情况下,我们是一个单件的内容链接到菜单项.在案件 要在其中多个内容项目链接到一个菜单项,你需要创建一个登陆页面(见 第7章)或视图(参见第10章).如果您使用的是标准Bartik主题(这是默认的主题 在Drupal 8),你应该看到靠近你的页面的顶部,您在“菜单中输入的值的新选项卡 链

URL路径设置----第二章:创建和管理内容

形式立即显示内容的下面.编辑内容,然后选择关闭选项,并点击 “保存并继续出版”按钮.你会发现在如何显示您的内容项的显著变化, 因为评论将不再出现. 图2-15.随着打开的默认设置,用户现在可以发布在网站上的评论 随着打开的默认设置,游客到您的网站现在可以编写和响应发表评论 你的内容项(假设你已经设置权限允许匿名用户发表评论, 我将在第6章盖).请尝试输入主题和注释,然后点击保存.你的评论 现在应该出现在注释部分. 由于内容作者(或该网站的管理员),你可以删除,编辑或回复评论 点击每个注释下的链接

预览和全展示----第二章:创建和管理内容

默认情况下,Drupal允许的内容项进行编辑,更新和删除该项目的作者.只有网站 这允许他们管理员或用户与角色进行编辑,更新和删除其他作者的内容可以 更改您的内容.如果您没有看到旁边的编辑内容项目的标题,那么你就不是 登录与适当的权限的帐户进行修改,该项目. 要更改内容项,单击编辑选项卡. Drupal将在编辑模式下显示的内容项, 在这里你可以更改或删除的项(见图2-6). 图2-6.内容将显示在编辑模式 还有另一种方式来编辑您的文章.尝试更新您在上一步中创建的文章 导航回主页.要导航回主页,点击

第二章 创建、删除和修改表

创建表 create table 表名(属性名 数据类型 [完整性约束条件], 属性名 数据类型 [完整性约束条件], 属性名 数据类型 [完整性约束条件]): 注:建表前先选择数据库 约束条件 约束条件 说明 primary key 设为主键 foreign key 设为外键,是与之联系的某表的主键 not null 设该属性不能为空 unique 标识该属性的值是唯一的 auto_increment 标识该属性的值自动增加 default 设置该属性的默认值 查看表结构 describe 表

[Effective Java 读书笔记] 第二章 创建和销毁对象 第六-?条

第六条 消除过期引用 JAVA中依然会有 memory leak的,比如一个栈先增长再收缩,那么从栈中弹出的对象是不会被当做垃圾回收的,即时使用栈的程序不再引用这些对象.这是因为栈的内部维护着对这些对象的过期引用(永远也不会被解除的引用),需要显示的将这些对象清空(置为null),告诉垃圾回收器回收这些对象. 比如Stack类的实现里,pop()函数最后会有对element置null的操作: public synchronized E pop() { E obj; int len = size(