Libevent源码分析—event_set()

初始化完event_base后,下面要初始化event,通过调用event_set()实现 。相关源码位于event.c

event_set()

void
event_set(struct event *ev, int fd, short events,
      void (*callback)(int, short, void *), void *arg)
{
    /* Take the current base - caller needs to set the real base later */
    ev->ev_base = current_base;    //设置event属于当前base;current_base通过event_init()设置
    ev->ev_callback = callback;    //设置回调函数
    ev->ev_arg = arg;    //设置回调函数的3个参数
    ev->ev_fd = fd;
    ev->ev_events = events;
    ev->ev_res = 0;
    ev->ev_flags = EVLIST_INIT;    //设置event状态
    ev->ev_ncalls = 0;
    ev->ev_pncalls = NULL;
    min_heap_elem_init(ev);    //初始化event在小根堆中索引为-1    min_heap.h
    /* by default, we put new events into the middle priority */
    if(current_base)
        ev->ev_pri = current_base->nactivequeues/2;    //设置event优先级
}

通过传入的参数:fd, events, 回调函数,arg设置event的相应成员,并初始化event在小根堆中的索引为-1,以及设置event的优先级。

接下来调用event_base_set()设置event所属的event_base。

其实在event_set()中已经将event所属的event_base设置为当前的current_base,而current_base在event_init()中被赋值为新建的event_base。所以,如果要将一个新的event捆绑的event_base设置为新建的event_base,则可以不需要event_base_set()这步调用。如果有多个event_base,则才需要这步;就一个event_base时,是不需要这步的,因为此时current_base就等于event_base。

event_base_set()

int
event_base_set(struct event_base *base, struct event *ev)
{
    /* Only innocent events may be assigned to a different base */
    if (ev->ev_flags != EVLIST_INIT)    //只能对新建的event设置其所属event_base
        return (-1);
    ev->ev_base = base;    //设置所属event_base
    ev->ev_pri = base->nactivequeues/2;    //设置优先级
    return (0);
}

由上面代码可看到,只能对新建的状态为EVLIST_INIT的event设置所属event_base

event有优先级,我们还可以单独调用下面的函数来专门设置event的优先级,但要求不能对活跃的event设置。

event_priority_set()

int
event_priority_set(struct event *ev, int pri)
{
    if (ev->ev_flags & EVLIST_ACTIVE)    //不能对活跃的event设置优先级
        return (-1);
    if (pri < 0 || pri >= ev->ev_base->nactivequeues)
        return (-1);
    ev->ev_pri = pri;    //设置优先级
    return (0);
}
时间: 2024-10-12 12:25:28

Libevent源码分析—event_set()的相关文章

[libevent源码分析] event_set

libevent使用event来封装网络事件回调,参数.fd...等一些信息,函数很简单 void event_set(struct event *ev, int fd, short events, void (*callback)(int, short, void *), void *arg) { /* Take the current base - caller needs to set the real base later */ ev->ev_base = current_base; /

Libevent源码分析-timer和signal处理

timer处理 Signal处理 timerfd和signalfd timerfd signalfd timer处理 在Libevent源码分析-event处理流程中,使用了定时器,来看一下源码: evtimer_set(&ev, time_cb, NULL);//设置定时器事件 其中evtimer_set是个宏定义 #define evtimer_set(ev, cb, arg) event_set((ev), -1, 0, (cb), (arg)) //event_set原型 void ev

【转】libevent源码分析

libevent源码分析 转自:http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html 这两天没事,看了一下Memcached和libevent的源码,做个小总结. 1.入门 1.1.概述Libevent是一个用于开发可扩展性网络服务器的基于事件驱动(event-driven)模型的网络库.Libevent有几个显著的亮点: (1)事件驱动(event-driven),高性能:(2)轻量级,专注于网络,不如 ACE 那么臃肿庞

Libevent源码分析 (1) hello-world

Libevent源码分析 (1) hello-world ⑨月份接触了久闻大名的libevent,当时想读读源码,可是由于事情比较多一直没有时间,现在手头的东西基本告一段落了,我准备读读libevent的源码,凡是我觉得有必要的内容均一一记录,与君共勉. 首先要说说什么是libevent: libevent是一个事件通知库,libevent API提供一种机制使得我们可以在一个文件描述符(file descriptor)发生特定事件时或者timeout发生时执行指定的回调函数.libevent意

libevent源码分析-event

event结构 event相关接口 Libevent对event的管理 event结构 event是Reactor模式中的最重要的组件.它包含了了一个句柄fd,并设置监听这个句柄上的哪些事件(读/写等),设置了对应的函数指针,在事件到来时,回调函数指针来处理事件. 先看一下event的结构.它位于include/event2/event_struct.h中 struct event { TAILQ_ENTRY(event) ev_active_next; TAILQ_ENTRY(event) e

[libevent源码分析] event_init

libevent采用的是经典的reactor网络框架,集成了信号.定时.网络事件于一体 首先对event_init进行源码剖析 event_init 主要创建event_base对象, struct event_base { const struct eventop *evsel; //lievent支持select epoll kequeue..等网络api,包括init.add.del.dispatch的接口,每种网络框架都支持 void *evbase; //支持相应网络api的 结构对象

[libevent源码分析] event_add

event_add 把event往当前event中的ev_base追加,如果需要定时,那么tv不能为空 int event_add(struct event *ev, const struct timeval *tv) { struct event_base *base = ev->ev_base; //event_add 会把event加入到他的ev_base成员里 const struct eventop *evsel = base->evsel; //对应linux的epoll相关函数

[libevent源码分析] event_base_dispatch

分析下事件循环 event_base_dispatch int event_base_dispatch(struct event_base *event_base) { return (event_base_loop(event_base, 0)); } int event_base_loop(struct event_base *base, int flags) { const struct eventop *evsel = base->evsel; void *evbase = base->

Libevent源码分析系列【转】

转自:https://www.cnblogs.com/zxiner/p/6919021.html 1.使用libevent库 源码那么多,该怎么分析从哪分析呢?一个好的方法就是先用起来,会用了,然后去看底层相应的源码,这样比较有条理,自上向下掌握.下面用libevent库写个程序,每隔1秒输出一行信息. test.c 2.event, event_base 经过第1步,下面开始看上面程序中的每一部分的源码.首先是两个核心结构体event和event_base event event_base源码