在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数组中的指针成员指向的单链表。
以上大体就是按照不同优先级处理事件的方式,也是比较容易理解的。