Operation链表的操作函数
总结概况
首先我们可以知道HksOperation结构体的构造
一种结构体套结构体的结构
而我们这里说的上链其实是这个g_operationList它本身也是一个DoubleList而它的结点也都是一个DoubleList的头结点,所以该链表的主干是每一个operation的ListHead的头结点然后每一个operationListHead中又包含了一个操作链DouleList和相关信息
这部分代码主要围绕DoubleList结构体进行operation链中链的构造、添加、查找结点等操作的功能函数编写
代码解读
1.double_list
从double_list可以知道这是双向链表的操作函数
四个操作:
1.双向列表的初始化——一个结点的首尾指针都指向自己结点
2.在头结点后插入一个结点pre跟next都是头结点
3.在尾部插入一个结点(该结点的下一个结点为头部)
4.移除结点
1.1InitializeDoubleList
1.2AddNodeAfterDoubleListHead
1.3AddNodeAtDoubleListTail
1.4RemoveDoubleListNode
/双向列表的初始化——一个结点的首尾指针都指向自己结点
void InitializeDoubleList(struct DoubleList *node)
{
if (node == NULL) {
return;
}
node->prev = node;
node->next = node;
}
//在头结点后插入一个结点pre跟next都是头结点
void AddNodeAfterDoubleListHead(struct DoubleList *head, struct DoubleList *node)
{
if ((head == NULL) || (node == NULL)) {
return;
}
if (head->next == NULL) {
head->next = head;
}
head->next->prev = node;
node->next = head->next;
node->prev = head;
head->next = node;
}
//在尾部插入一个结点(该结点的下一个结点为头部)
void AddNodeAtDoubleListTail(struct DoubleList *head, struct DoubleList *node)
{
if ((head == NULL) || (node == NULL)) {
return;
}
if (head->prev == NULL) {
head->prev = head;
}
head->prev->next = node;
node->next = head;
node->prev = head->prev;
head->prev = node;
}
//移除结点
void RemoveDoubleListNode(struct DoubleList *node)
{
if (node == NULL) {
return;
}
if (node->next != NULL) {
node->next->prev = node->prev;
}
if (node->prev != NULL) {
node->prev->next = node->next;
}
node->prev = NULL;
node->next = NULL;
}
2.hks_operation
对于operation链中链的操作函数
使用互斥锁是为了保证数据的读写时空的一致性
2.1FreeOperation
函数功能:释放操作链表
函数实现:将对应的链下链并调用宏定义的函数HKS_FREE_BLOB和HKS_FREE_PTR进行释放
2.2AddOperation
函数功能:进行操作链表的上链
函数实现:互斥锁的获取---->检查链表结点的个数---->如果大于等于最大结点数则将第一个已执行过即abortable属性为true的结点进行删除---->将所给链表的listHead插入全局的g_operationList中---->互斥锁的释放
2.3CreateOperation
函数功能:根据传入的参数创建一个operation上链
函数实现:为operation分配空间---->进行数据的赋值---->将新构建好的operation上链g_operationList
2.4QueryOperation
函数功能:返回operationHandle相同的operation用于加载入队列执行相应命令操作
2.5DeleteOperation
函数功能:根据operationHandle将一个operation结点删除
2.6DeleteSession
函数功能:根据processName将一个operation下链删除
函数实现:该函数跟DeleteOperation实现的功能相似,但是判断的条件略有不同,一个是通过operationHandle,一个是通过processName也就是进程名称来寻找
2.7DeleteFirstAbortableOperation
函数功能:将最早abortable为true的上链listHead进行删除
2.8GetAbortableOperationCount
函数功能:获取当前可废弃的(应该是已经执行完毕的)操作链表点的数量