一、event_entry结构体
struct event_config_entry {
// 下一个屏蔽的后台方法名
TAILQ_ENTRY(event_config_entry) next;
// 屏蔽的后台方法名
const char *avoid_method;
};
二、event_config结构体
** Internal structure: describes the configuration we want for an event_base
* that we're about to allocate. */
// 内部结构体,用于描述对event_base进行配置的配置信息
struct event_config {
// 屏蔽的后台方法列表
TAILQ_HEAD(event_configq, event_config_entry) entries;
// cpu个数,这个仅仅是对event_base的建议,不是强制的
int n_cpus_hint;
// 如果不执行以下检查,默认情况下,event_base会按照当前优先级队列的顺序,一直将本优先级
// 队列的事件执行完毕之后才会检查新事件,这样的好处是吞吐量大,但是在低优先级队列比较长时,
// 会导致某些高优先级一直在等待执行,无法抢占cpu
// event_base在event_loop中两次检查新事件之间执行回调函数的时间间隔
// 需要每次执行完回调函数之后都进行检查
struct timeval max_dispatch_interval;
// event_base在event_loop中两次检查新事件之间执行调度回调函数的最大个数
// 需要每次执行完回调函数之后都进行检查
int max_dispatch_callbacks;
// 用于启动上面两个检查的开关,如果=0,则每次执行完毕回调函数之后都强制进行检查;
// 如果=n,则只有在执行完毕>=n的优先级事件之后才会强制执行上述检查
int limit_callbacks_after_prio;
// event_base后台方法需要的特征
// enum event_method_feature {
// 边沿触发
// EV_FEATURE_ET = 0x01,
// 要求事后台方法在调度很多事件时大约为O(1)操作,select和poll无法提供这种特征,
// 这两种方法具有N个事件时,可以提供O(N)操作
// EV_FEATURE_O1 = 0x02,
// 后台方法可以处理各种文件描述符,而不仅仅是sockets
// EV_FEATURE_FDS = 0x04,
/** Require an event method that allows you to use EV_CLOSED to detect
* connection close without the necessity of reading all the pending data.
*
* Methods that do support EV_CLOSED may not be able to provide support on
* all kernel versions.
**/
// 要求后台方法允许使用EV_CLOSED特征检测链接是否中断,而不需要读取
// 所有未决数据;但是不是所有内核都能提供这种特征
// EV_FEATURE_EARLY_CLOSE = 0x08
// };
enum event_method_feature require_features;
// event_base配置的特征值
// 多线程调用是不安全的,单线程非阻塞模式
// EVENT_BASE_FLAG_NOLOCK = 0x01,
// 忽略检查EVENT_*等环境变量
// EVENT_BASE_FLAG_IGNORE_ENV = 0x02,
// 只用于windows
// EVENT_BASE_FLAG_STARTUP_IOCP = 0x04,
// 不使用缓存的时间,每次回调都会获取系统时间
// EVENT_BASE_FLAG_NO_CACHE_TIME = 0x08,
// 如果使用epoll方法,则使用epoll内部的changelist
// EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST = 0x10,
// 使用更精确的时间,但是可能性能会降低
// EVENT_BASE_FLAG_PRECISE_TIMER = 0x20
enum event_base_config_flag flags;
};