事件的优先级机制

在libhv库中,可以对各种事件设置不同的优先级,库提供了一个设置宏,可以简单设置。

#define hevent_set_priority(ev, prio)   ((hevent_t*)(ev))->priority = prio

使用方法很简单,而且在hloop_test.c测试文件中有使用例子,不再多说,下面简单说下libhv对不同优先级事件的处理方式

在hloop_process_events接口中,处理各种事件,其中定时器是具有最高优先级的,在libhv中,如果存在定时器任务,会优先处理定时器任务,关于定时器的更多的说明,之后会单独写一篇博客。

但不管是定时器,还是其他事件发生,都会使用EVENT_PENDING宏,将事件加入到待处理事件中,而该宏,也是优先级功能实现的核心。

#define EVENT_PENDING(ev) \
    do {\
        if (!ev->pending) {\
            ev->pending = 1;\
            ev->loop->npendings++;\
            hevent_t** phead = &ev->loop->pendings[HEVENT_PRIORITY_INDEX(ev->priority)];\
            ev->pending_next = *phead;\
            *phead = (hevent_t*)ev;\
        }\
    } while(0)

在hloop_t事件轮询结构体中,有一个成员

hevent_t*                   pendings[HEVENT_PRIORITY_SIZE];

该成员就是用来放不同优先级的待处理事件的。数组的每一个指针成员都指向对应优先级的一个链表。上面的宏的核心功能就是将事件ev按照优先级前插入到对应的链表中。

最后在hloop_process_pendings中处理待处理事件:

static int hloop_process_pendings(hloop_t* loop) {
    if (loop->npendings == 0) return 0;

    hevent_t* cur = NULL;
    hevent_t* next = NULL;
    int ncbs = 0;
    for (int i = HEVENT_PRIORITY_SIZE-1; i >= 0; --i) {
        cur = loop->pendings[i];
        while (cur) {
            next = cur->pending_next;
            if (cur->pending) {
                if (cur->active && cur->cb) {
                    cur->cb(cur);
                    ++ncbs;
                }
                cur->pending = 0;
                if (cur->destroy) {
                    EVENT_DEL(cur);
                }
            }
            cur = next;
        }
        loop->pendings[i] = NULL;
    }
    loop->npendings = 0;
    return ncbs;
}

从高优先级向低优先级遍历数组,然后遍历pendings数组中的指针成员指向的单链表。

以上大体就是按照不同优先级处理事件的方式,也是比较容易理解的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值