创建event_base

来源:互联网 发布:可爱表情贴图软件 编辑:程序博客网 时间:2024/05/01 18:25
在使用libevent函数之前,你需要至少创建一个event_base。每个event_base保护一组event并可以轮选检测那个event是活跃的。
如果一个event_base设置为使用锁,多个线程可以对其安全的访问。它的循环只能在单线程中运行。如果想有多个线程轮询IO,则每个线程都需要有一个event_base.
每个event_base都有一个方法来判断那个event是活跃的。公认的方法有:
select
poll
epoll
kqueue
devpoll
evport
win32
一 设置一个默认的event_base
 event_base_new()分配并返回一个带有默认值的新event_base。该函数返回一个指向event_base的指针,如果出错则返回NULL
struct event_base * event_base_new(void);

二 设置复杂的event_base
如果你想控制event_base,则需要event_config。event_config包含了你要设置event_base的偏好信息。
struct event_config * event_config_new(void); 
struct event_base * event_base_new_with_config(const struct event_config * cfg); 
void event_config_free(struct event_config * cfg);
要用这些函数创建一个event_base,先用event_config_new创建一个event_config ,然后调用其他函数设置event_config ,最后调用event_base_new_with_config创建event_base。所有事情做完之后调用event_config_free释放event_config 。

int event_config_avoid_method(struct event_config *cfg, constchar *method);
event_config_avoid_method告诉libevent回避指定的方法。
enum event_method_feature { EV_FEATURE_ET = 0x01, //需要一个支持边沿触发的IO方法 EV_FEATURE_O1 = 0x02, //需要一个添加或删除一个事件是O1操作的方法
    EV_FEATURE_FDS = 0x04,  //需要一个支持任意文件描述符的方法};int event_config_require_features(struct event_config *cfg,enum event_method_feature feature);
event_config_require_feature告诉libevent不要使用不支持一组特性的所有值的方法。
enum event_base_config_flag { EVENT_BASE_FLAG_NOLOCK = 0x01,//不为event_base 分配锁 EVENT_BASE_FLAG_IGNORE_ENV = 0x02, //选择采用哪个方法时不检测EVENT_*环境变量。使用该flag之前要认真思考。 EVENT_BASE_FLAG_STARTUP_IOCP = 0x04,//只在window上使用,在初始化时就使libevent任何必要的IOCP 调度逻辑可用 EVENT_BASE_FLAG_NO_CACHE_TIME = 0x08,//在调用超时回调函数之前不检查当前时间 EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST = 0x10,//告诉libevent,如果决定用epoll,更可靠的做法是使用基于changelist的方法 EVENT_BASE_FLAG_PRECISE_TIMER = 0x20 //默认情况下,libevent使用的是系统提供的最快的计时器。如果有更精确的计时器,则该flag告诉libevent使用更精确的计时器。};int event_config_set_flag(struct event_config *cfg,enum event_base_config_flag flag);
event_config_set_flag告诉libevent创建event_base是设置运行时标记。
以上函数执行成功返回0,失败则返回-1
int event_config_set_num_cpus_hint(struct event_config *cfg, int cpus)
该函数只有是window上使用IOCP时有用。该函数告诉event_config,在多线程情况下其产生的event_base应该充分使用多个cpu。

int event_config_set_max_dispatch_interval(struct event_config *cfg,    conststruct timeval *max_interval, int max_callbacks,    int min_priority);
该函数通过限制检查多少低优先级回调函数被调用之前检测更高优先级事件,防止出现优先级反转。
max_interval非0,事件循环在每次回调之后检查事件,并重新扫描更高优先级的事件。
max_callbacks非负,则调用max_callbacks个回调函数之后也检查更多事件。这些规则对min_priority 或更高优先级的事件都适用。
三 检查event_base的后端方法
有时候我们需要知道event_base的那个特性或方法是可用的。
constchar **event_get_supported_methods(void);
该函数返回一个指向方法名列表的指针。最后一个元素是NULL。
int i;constchar **methods = event_get_supported_methods();printf("Starting Libevent %s.  Available methods are:\n",    event_get_version());for (i=0; methods[i] != NULL; ++i) {    printf("    %s\n", methods[i]);}

constchar *event_base_get_method(conststruct event_base *base);enum event_method_feature event_base_get_features(conststruct event_base *base);
event_base_get_method返回event_base实际在用的方法名
event_base_get_features返回event_base支持的特性的掩码值

struct event_base *base;enum event_method_feature f;base = event_base_new();if (!base) {    puts("Couldn't get an event_base!");} else {    printf("Using Libevent with backend method %s.",        event_base_get_method(base));    f = event_base_get_features(base);    if ((f & EV_FEATURE_ET))        printf("  Edge-triggered events are supported.");    if ((f & EV_FEATURE_O1))        printf("  O(1) event notification is supported.");    if ((f & EV_FEATURE_FDS))        printf("  All FD types are supported.");    puts("");}
四  回收event_base
void event_base_free(struct event_base *base);
五 设置event_base优先级
int event_base_priority_init(struct event_base *base, int n_priorities);
libevent支持给event设置多个优先级,但是只能给event_base设置一个优先级。该函数执行成功返回0,失败则返回-1.n_priorities 最小值为1。新的event的优先级为0 —— n_priorities -1。最大值为EVENT_MAX_PRIORITIES。
最好是在创建event_base之后立即调用该函数。
int event_base_get_npriorities(struct event_base *base);
该函数用来获取event_base支持的优先级个数。
默认情况下,所有与base相关的新event的优先级会初始化为 n_priorities / 2
六 调用fork()之后重新初始化一个event_base
int event_reinit(struct event_base *base);
当你调用fork创建新的进程之后,则需要重新初始化一个原有的event_base.















0 0