前面提到了跟 DelayTask相关的一个链表,现在来看跟BackgroundHandling相关的另一个链表:
HandleSet.
这个链表跟:
这3个函数相关。
其中setBackgroundHandling根据第二个参数 int conditionSet 是否为零 对应于插入和删除节点的操作。
disableBackgroundHanding 对应删除节点操作。
moveSocketHandling 对应替换操作。
然后我们来看HandleSet有什么操作:
首先提一点的是HandleSet是一个单链表,只提供表头插入操作,但是删除操作不限于此。
assignHandler :第一步,查找 看这个节点是否在表里面,如果不在就新建一个节点,并插入表头。然后根据参数对节点的属性进行赋值。
clearHandler:清除节点
moveHandler:替换节点
还提供了一个函数 lookupHandler,这个函数是根据标志符来查找节点,
在这个函数实现的时候,用到了 HandlerIterator,这是一个跟节点相关的迭代器,但是这个迭代器只提供了 前移操作(++),所以另一方面也说明了这个链表是单链表(但是节点却提供了 指向前后节点的指针)。
下一步来看看节点:
这个节点里面除了包含指向前后节点的指针外还提供了下面一些属性:
int socketNum 跟这个节点相关的socket值
int conditionSet 标志位,跟socketNum相关,通过这个标识位,我们可以知道后面是要判断socket的可读,可写,还是 异常。
handlerProc 这是一个函数指针。可能到时候跟socketNum相关,比如这个socket上有数据来了,然后就调用这个函数
void* clientData 可能是上面这个函数指针的参数。
上面就是对跟TaskScheduler相关的第二个链表。
最后我们来看跟TaskScheduler相关的第三个链表:
严格来说这不是一个链表,而是两个数组:
与之对应还有3个变量:
上面这些属性是跟下面这3个函数想对应的:
第一个函数createEventTrigger相当于创建一个节点:在上面2个数组里面添加一个元素。第一个数组对应的是函数指针,第二个数组对应的函数参数(这个时候都是把参数设为NULL)。fLastUsedTriggerNum就是对应的在数组中的位置,fLastUsedTriggerMask对应的是掩码(标识符)。
第二个函数deleteEventTrigger对应的是删除节点,那么主要就是把数组对应位上的值置为空,然后是把fTriggersAwaitingHandling对应的标志位置为0.
第三个函数triggerEvent 表明某个事件该触发了,在这里是通过把fTriggersAwaitingHandling对应的标志位置为1来实现的。
上面就是跟TaskScheduler相关的数据结构以及对应的函数了,注意我们还有一个最重要的函数doEventLoop 没说,后面有时间就把这个函数的实现来分析下。