55 if (pstTree == NULL || pstX == NULL) {
58 pstNilT = &(pstTree->
stNilT);
93 if (NULL == pstTree || NULL == pstY) {
97 pstNilT = &(pstTree->
stNilT);
135 if ((NULL == pstTree) || (NULL == pstData)) {
146 if (pstParent == pstGParent->
pstLeft) {
148 if (LOS_RB_RED == pstY->
lColor) {
149 pstY->
lColor = LOS_RB_BLACK;
150 pstParent->
lColor = LOS_RB_BLACK;
151 pstGParent->
lColor = LOS_RB_RED;
162 pstGParent->
lColor = LOS_RB_RED;
166 if (LOS_RB_RED == pstY->
lColor) {
167 pstY->
lColor = LOS_RB_BLACK;
168 pstParent->
lColor = LOS_RB_BLACK;
169 pstGParent->
lColor = LOS_RB_RED;
174 if (pstParent->
pstLeft == pstX) {
180 pstGParent->
lColor = LOS_RB_RED;
194 if (NULL == pstTree || NULL == pstNode) {
197 while ((pstNode != pstTree->
pstRoot) && (LOS_RB_BLACK == pstNode->
lColor)) {
200 if (LOS_RB_RED == pstW->
lColor) {
201 pstW->
lColor = LOS_RB_BLACK;
208 pstW->
lColor = LOS_RB_RED;
213 pstW->
lColor = LOS_RB_RED;
225 if (LOS_RB_RED == pstW->
lColor) {
226 pstW->
lColor = LOS_RB_BLACK;
232 pstW->
lColor = LOS_RB_RED;
237 pstW->
lColor = LOS_RB_RED;
249 pstNode->
lColor = LOS_RB_BLACK;
267 if ((NULL == pstTree) || (NULL == pstData)) {
272 pstNilT = &(pstTree->
stNilT);
275 if (!RB_IS_NOT_NILT(pstZ)) {
288 LOS_DL_LIST_FOR_EACH(pstNode, &pstTree->
stWalkHead)
290 pstWalk = LOS_DL_LIST_ENTRY(pstNode,
LosRbWalk, stLink);
299 if (NULL == pstChild) {
315 if (LOS_RB_BLACK == pstZ->
lColor) {
320 pstZ->
lColor = LOS_RB_RED;
335 while (pstNilT != pstZ->
pstLeft) {
341 if (NULL == pstChild) {
381 if (LOS_RB_BLACK == lColor) {
386 pstDel->
lColor = LOS_RB_RED;
394 if (NULL == pstTree) {
418 if (NULL == pstTree) {
422 pstNode = LOS_DL_LIST_FIRST(&pstTree->
stWalkHead);
423 while (!LOS_DL_LIST_IS_END(&pstTree->
stWalkHead, pstNode)) {
424 pstWalk = LOS_DL_LIST_ENTRY(pstNode,
LosRbWalk, stLink);
429 pstNode = LOS_DL_LIST_FIRST(&pstTree->
stWalkHead);
440 if (NULL == pstTree) {
445 if (NULL == pstNode) {
450 if (NULL == pstWalk) {
472 if ((NULL == pstWalk) || (NULL == pstWalk->
pstCurrNode) || (NULL == pstWalk->
pstTree)) {
483 if (NULL == pstWalk) {
487 if (LOS_DL_LIST_IS_ON_QUEUE(&pstWalk->
stLink)) {
500 VOID *pNodeKey = NULL;
504 pstNew->
lColor = LOS_RB_RED;
506 if ((pstNew->
pstParent = pstParent) == pstNilT) {
509 pNodeKey = pstTree->
pfGetKey(pstNew);
510 pKey = pstTree->
pfGetKey(pstParent);
511 ulCmpResult = pstTree->
pfCmpKey(pNodeKey, pKey);
512 if (RB_SMALLER == ulCmpResult) {
526 if (NULL == pstTree) {
543 if (NULL == pstTree) {
546 if (NULL == pstTree->
pfFree) {
550 RB_WALK(pstTree, pstNode, pstWalk)
553 (VOID)pstTree->
pfFree(pstNode);
555 RB_WALK_END(pstTree, pstNode, pstWalk);
567 if (NULL == pstTree) {
572 if (pstNode == NULL) {
575 pstNilT = &(pstTree->
stNilT);
577 if (pstNilT == pstNode) {
581 while (pstNilT != pstNode->
pstLeft) {
594 if (NULL == pstTree) {
600 if (NULL == pstNode) {
605 if (!RB_IS_NOT_NILT(pstNode)) {
610 pstNilT = &(pstTree->
stNilT);
614 while (pstNilT != pstNode->
pstLeft) {
623 while ((pstNilT != pstY) && (pstNode == pstY->
pstRight)) {
628 return ((pstNilT == pstY) ? NULL : pstY);
637 }
else if ((NULL == pNode) || (&pstTree->
stNilT == pNode)) {
639 }
else if (RB_BIGGER == pstTree->
pfCmpKey(pKey, pstTree->
pfGetKey(pNode))) {
640 while (NULL != pNode) {
661 VOID *pNodeKey = NULL;
664 if ((NULL == pstTree) || (NULL == pKey) || (NULL == ppstNode)) {
665 if (NULL != ppstNode) {
675 pstNilT = &pstTree->
stNilT;
679 while (pstX != pstNilT) {
682 ulCmpResult = pstTree->
pfCmpKey(pKey, pNodeKey);
683 if (RB_EQUAL == ulCmpResult) {
687 if (RB_SMALLER == ulCmpResult) {
708 VOID *pNodeKey = NULL;
711 if ((NULL == pstTree) || (NULL == pstNew)) {
718 pNodeKey = pstTree->
pfGetKey(pstNew);
720 if (TRUE == ulSearchNode) {
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node)
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.
LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
Identify whether a specified doubly linked list is empty. | 判断链表是否为空
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
UINT8 * m_aucSysMem0
异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
VOID LOS_RbInsertOneNodeProcess(LosRbTree *pstTree, LosRbNode *pstParent, LosRbNode *pstNew)
VOID LOS_RbDeleteWalk(LosRbWalk *pstWalk)
STATIC VOID OsRbClearTree(LosRbTree *pstTree)
STATIC VOID OsRbRightRotateNode(LosRbTree *pstTree, LosRbNode *pstY)
STATIC VOID OsRbLeftRotateNode(LosRbTree *pstTree, LosRbNode *pstX)
LosRbNode * LOS_RbGetNextNode(LosRbTree *pstTree, VOID *pKey)
ULONG_T LOS_RbAddNode(LosRbTree *pstTree, LosRbNode *pstNew)
VOID LOS_RbInitTree(LosRbTree *pstTree, pfRBCmpKeyFn pfCmpKey, pfRBFreeFn pfFree, pfRBGetKeyFn pfGetKey)
VOID LOS_RbDestroyTree(LosRbTree *pstTree)
VOID * LOS_RbWalkNext(LosRbWalk *pstWalk)
VOID LOS_RbDelNode(LosRbTree *pstTree, LosRbNode *pstNode)
STATIC VOID OsRbDeleteNodeFixup(LosRbTree *pstTree, LosRbNode *pstNode)
VOID * LOS_RbSuccessorNode(LosRbTree *pstTree, VOID *pstData)
STATIC VOID OsRbInitTree(LosRbTree *pstTree)
VOID * LOS_RbFirstNode(LosRbTree *pstTree)
STATIC VOID OsRbInsertNodeFixup(LosRbTree *pstTree, VOID *pstData)
STATIC VOID OsRbDeleteNode(LosRbTree *pstTree, VOID *pstData)
ULONG_T LOS_RbGetNode(LosRbTree *pstTree, VOID *pKey, LosRbNode **ppstNode)
LosRbWalk * LOS_RbCreateWalk(LosRbTree *pstTree)
ULONG_T(* pfRBCmpKeyFn)(const VOID *, const VOID *)
VOID *(* pfRBGetKeyFn)(LosRbNode *)
ULONG_T(* pfRBFreeFn)(LosRbNode *)
struct TagRbNode * pstParent
爸爸是谁 ?
struct TagRbNode * pstLeft
左孩子是谁 ?
struct TagRbNode * pstRight
右孩子是谁 ?
struct TagRbTree * pstTree