更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_sortlink.c 文件参考

浏览源代码.

函数

VOID OsSortLinkInit (SortLinkAttribute *sortLinkHeader)
 排序链表初始化 更多...
 
STATIC INLINE VOID AddNode2SortLink (SortLinkAttribute *sortLinkHeader, SortLinkList *sortList)
 OsAddNode2SortLink 向链表中插入结点,并按时间顺序排列 更多...
 
VOID OsAdd2SortLink (SortLinkAttribute *head, SortLinkList *node, UINT64 responseTime, UINT16 idleCpu)
 
VOID OsDeleteFromSortLink (SortLinkAttribute *head, SortLinkList *node)
 
UINT32 OsSortLinkAdjustNodeResponseTime (SortLinkAttribute *head, SortLinkList *node, UINT64 responseTime)
 
UINT64 OsSortLinkGetTargetExpireTime (UINT64 currTime, const SortLinkList *targetSortList)
 
UINT64 OsSortLinkGetNextExpireTime (UINT64 currTime, const SortLinkAttribute *sortLinkHeader)
 

函数说明

◆ AddNode2SortLink()

STATIC INLINE VOID AddNode2SortLink ( SortLinkAttribute sortLinkHeader,
SortLinkList sortList 
)

OsAddNode2SortLink 向链表中插入结点,并按时间顺序排列

参数
sortLinkHeader被插入的链表
sortList要插入的结点
返回
参见

在文件 los_sortlink.c50 行定义.

51{
52 LOS_DL_LIST *head = (LOS_DL_LIST *)&sortLinkHeader->sortLink; //获取双向链表
53
54 if (LOS_ListEmpty(head)) { //空链表,直接插入
55 LOS_ListHeadInsert(head, &sortList->sortLinkNode);//插入结点
56 sortLinkHeader->nodeNum++;//CPU的工作量增加了
57 return;
58 }
59 //链表不为空时,插入分三种情况, responseTime 大于,等于,小于的处理
60 SortLinkList *listSorted = LOS_DL_LIST_ENTRY(head->pstNext, SortLinkList, sortLinkNode);
61 if (listSorted->responseTime > sortList->responseTime) {//如果要插入的节点 responseTime 最小
62 LOS_ListAdd(head, &sortList->sortLinkNode);//能跑进来说明是最小的,直接插入到第一的位置
63 sortLinkHeader->nodeNum++;//CPU的工作量增加了
64 return;//直接返回了
65 } else if (listSorted->responseTime == sortList->responseTime) {//相等的情况
66 LOS_ListAdd(head->pstNext, &sortList->sortLinkNode);//插到第二的位置
67 sortLinkHeader->nodeNum++;
68 return;
69 }
70 //处理大于链表中第一个responseTime的情况,需要遍历链表
71 LOS_DL_LIST *prevNode = head->pstPrev;//注意这里用的前一个结点,也就是说前一个结点中的responseTime 是最大的
72 do { // @note_good 这里写的有点妙,也是双向链表的魅力所在
73 listSorted = LOS_DL_LIST_ENTRY(prevNode, SortLinkList, sortLinkNode);//一个个遍历,先比大的再比小的
74 if (listSorted->responseTime <= sortList->responseTime) {//如果时间比你小,就插到后面
75 LOS_ListAdd(prevNode, &sortList->sortLinkNode);
76 sortLinkHeader->nodeNum++;
77 break;
78 }
79
80 prevNode = prevNode->pstPrev;//再拿上一个更小的responseTime进行比较
81 } while (1);//死循环
82}
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListHeadInsert(LOS_DL_LIST *list, LOS_DL_LIST *node)
Insert a node to the head of a doubly linked list.
Definition: los_list.h:268
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListAdd(LOS_DL_LIST *list, LOS_DL_LIST *node)
Insert a new node to a doubly linked list.
Definition: los_list.h:217
LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
Identify whether a specified doubly linked list is empty. | 判断链表是否为空
Definition: los_list.h:321
struct LOS_DL_LIST * pstPrev
Definition: los_list.h:83
struct LOS_DL_LIST * pstNext
Definition: los_list.h:84
if(tv==NULL)
Definition: time.c:430
函数调用图:
这是这个函数的调用关系图:

◆ OsAdd2SortLink()

VOID OsAdd2SortLink ( SortLinkAttribute head,
SortLinkList node,
UINT64  responseTime,
UINT16  idleCpu 
)

在文件 los_sortlink.c84 行定义.

85{
86 LOS_SpinLock(&head->spinLock);
87 SET_SORTLIST_VALUE(node, responseTime);
88 AddNode2SortLink(head, node);
89#ifdef LOSCFG_KERNEL_SMP
90 node->cpuid = idleCpu;
91#endif
93}
VOID LOS_SpinLock(SPIN_LOCK_S *lock)
Definition: los_spinlock.c:50
VOID LOS_SpinUnlock(SPIN_LOCK_S *lock)
Definition: los_spinlock.c:84
函数调用图:
这是这个函数的调用关系图:

◆ OsDeleteFromSortLink()

VOID OsDeleteFromSortLink ( SortLinkAttribute head,
SortLinkList node 
)

在文件 los_sortlink.c95 行定义.

96{
97 LOS_SpinLock(&head->spinLock);
98 if (node->responseTime != OS_SORT_LINK_INVALID_TIME) {
99 OsDeleteNodeSortLink(head, node);
100 }
101 LOS_SpinUnlock(&head->spinLock);
102}
函数调用图:
这是这个函数的调用关系图:

◆ OsSortLinkAdjustNodeResponseTime()

UINT32 OsSortLinkAdjustNodeResponseTime ( SortLinkAttribute head,
SortLinkList node,
UINT64  responseTime 
)

在文件 los_sortlink.c104 行定义.

105{
106 UINT32 ret = LOS_NOK;
107
108 LOS_SpinLock(&head->spinLock);
109 if (node->responseTime != OS_SORT_LINK_INVALID_TIME) {
110 OsDeleteNodeSortLink(head, node);
111 SET_SORTLIST_VALUE(node, responseTime);
112 AddNode2SortLink(head, node);
113 ret = LOS_OK;
114 }
115 LOS_SpinUnlock(&head->spinLock);
116 return ret;
117}
unsigned int UINT32
Definition: los_typedef.h:57
函数调用图:
这是这个函数的调用关系图:

◆ OsSortLinkGetNextExpireTime()

UINT64 OsSortLinkGetNextExpireTime ( UINT64  currTime,
const SortLinkAttribute sortLinkHeader 
)

在文件 los_sortlink.c128 行定义.

129{
130 LOS_DL_LIST *head = (LOS_DL_LIST *)&sortLinkHeader->sortLink;
131
132 if (LOS_ListEmpty(head)) {
133 return OS_SORT_LINK_INVALID_TIME;
134 }
135
136 SortLinkList *listSorted = LOS_DL_LIST_ENTRY(head->pstNext, SortLinkList, sortLinkNode);
137 return OsSortLinkGetTargetExpireTime(currTime, listSorted);
138}
函数调用图:
这是这个函数的调用关系图:

◆ OsSortLinkGetTargetExpireTime()

UINT64 OsSortLinkGetTargetExpireTime ( UINT64  currTime,
const SortLinkList targetSortList 
)

在文件 los_sortlink.c119 行定义.

120{
121 if (currTime >= targetSortList->responseTime) {
122 return 0;
123 }
124
125 return (UINT32)(targetSortList->responseTime - currTime);
126}
这是这个函数的调用关系图:

◆ OsSortLinkInit()

VOID OsSortLinkInit ( SortLinkAttribute sortLinkHeader)

排序链表初始化

在文件 los_sortlink.c34 行定义.

35{
36 LOS_ListInit(&sortLinkHeader->sortLink);
37 LOS_SpinInit(&sortLinkHeader->spinLock);
38 sortLinkHeader->nodeNum = 0;
39}
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
Definition: los_list.h:104
VOID LOS_SpinInit(SPIN_LOCK_S *lock)
Definition: los_spinlock.c:37
函数调用图:
这是这个函数的调用关系图: