现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

libevent之event相关接口

2018-03-25 22:47 工业·编程 ⁄ 共 1546字 ⁄ 字号 暂无评论

1 . 创建事件 (event_new)

主要完成event的空间分配,

struct event * event_new(struct event_base *base,

                        evutil_socket_t fd,

                        void (*cb)(evutil_socket_t, short, void *),

                        void *arg)

{

    struct event *ev;

    // 分配new event的空间

    ev = mm_malloc(sizeof(struct event));

    ...

    // event的参数赋值

    ev->ev_base = base;         // 依附的event_base

    ev->ev_callback = callback; // 设置回调函数

    ev->ev_arg = arg;

    ev->ev_fd = fd;

    ev->ev_events = events;     // 该event注册的事件类型

    ev->ev_res = 0;

    ev->ev_flags = EVLIST_INIT; // ev_flags设置为初始化

    ev->ev_ncalls = 0;          // 回调函数执行了0次

    ev->ev_pncalls = NULL;

    // 根据event的ev_events的值,设置event的关闭方式

    if (events & EV_SIGNAL) {...}

    else

    {

        if (events & EV_PERSIST) { // event为

            evutil_timerclear(&ev->ev_io_timeout);  // 清除超时设置

            ev->ev_closure = EV_CLOSURE_PERSIST;

        } else {

            ev->ev_closure = EV_CLOSURE_NONE;

        }

    }

    ...

    // 优先级设置为active queue的大小的中间值

    ev->ev_pri = base->nactivequeues / 2;

    ...

    return (ev);

}

2 . 事件设置

对event的设置主要通过三个函数完成:event_set()、event_base_set()、event_priority_set()。

event_set函数的实现与event_new的类似,对event结构体的各参数进行赋值。

void event_set(struct event *ev,

                int fd,

                short events,

                void (*callback)(int, short, void *), // event的回调函数

                void *arg) // 用户传递的参数

event_base_set函数完成event注册到其他的event_base,仅当event的状态为EVLIST_INIT(即只执行了event_new,但还没有event_add)时,才能将event注册到新的event_base。

int event_base_set(struct event_base *base, struct event *ev)

event_priority_set函数设置event的执行优先级,仅当event的状态不是EVLIST_ACTIVE,才能将event的优先级进行设置。

int event_priority_set(struct event *ev, int pri)

 

给我留言

留言无头像?