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

一起读读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);

函数的

 

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