• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2009-2022 Huawei Technologies Co., Ltd. All rights reserved.
3  *
4  * UniProton is licensed under Mulan PSL v2.
5  * You can use this software according to the terms and conditions of the Mulan PSL v2.
6  * You may obtain a copy of Mulan PSL v2 at:
7  *          http://license.coscl.org.cn/MulanPSL2
8  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
9  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
10  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
11  * See the Mulan PSL v2 for more details.
12  * Create: 2009-12-22
13  * Description: 双向链表操作的内部头文件
14  */
15 #ifndef PRT_LIST_EXTERNAL_H
16 #define PRT_LIST_EXTERNAL_H
17 
18 #include "prt_typedef.h"
19 
20 struct TagListObject {
21     struct TagListObject *prev;
22     struct TagListObject *next;
23 };
24 
25 #define LIST_OBJECT_INIT(object) { \
26         &(object), &(object)       \
27     }
28 
29 #define INIT_LIST_OBJECT(object)   \
30     do {                           \
31         (object)->next = (object); \
32         (object)->prev = (object); \
33     } while (0)
34 
35 #define LIST_LAST(object) ((object)->prev)
36 #define LIST_FIRST(object) ((object)->next)
37 #define OS_LIST_FIRST(object) ((object)->next)
38 
39 /* list action low level add */
ListLowLevelAdd(struct TagListObject * newNode,struct TagListObject * prev,struct TagListObject * next)40 OS_SEC_ALW_INLINE INLINE void ListLowLevelAdd(struct TagListObject *newNode, struct TagListObject *prev,
41                                               struct TagListObject *next)
42 {
43     newNode->next = next;
44     newNode->prev = prev;
45     next->prev = newNode;
46     prev->next = newNode;
47 }
48 
49 /* list action add */
ListAdd(struct TagListObject * newNode,struct TagListObject * listObject)50 OS_SEC_ALW_INLINE INLINE void ListAdd(struct TagListObject *newNode, struct TagListObject *listObject)
51 {
52     ListLowLevelAdd(newNode, listObject, listObject->next);
53 }
54 
55 /* list action tail add */
ListTailAdd(struct TagListObject * newNode,struct TagListObject * listObject)56 OS_SEC_ALW_INLINE INLINE void ListTailAdd(struct TagListObject *newNode, struct TagListObject *listObject)
57 {
58     ListLowLevelAdd(newNode, listObject->prev, listObject);
59 }
60 
61 /* list action lowel delete */
ListLowLevelDelete(struct TagListObject * prevNode,struct TagListObject * nextNode)62 OS_SEC_ALW_INLINE INLINE void ListLowLevelDelete(struct TagListObject *prevNode, struct TagListObject *nextNode)
63 {
64     nextNode->prev = prevNode;
65     prevNode->next = nextNode;
66 }
67 
68 /* list action delete */
ListDelete(struct TagListObject * node)69 OS_SEC_ALW_INLINE INLINE void ListDelete(struct TagListObject *node)
70 {
71     ListLowLevelDelete(node->prev, node->next);
72 
73     node->next = NULL;
74     node->prev = NULL;
75 }
76 
77 /* list action empty */
ListEmpty(const struct TagListObject * listObject)78 OS_SEC_ALW_INLINE INLINE bool ListEmpty(const struct TagListObject *listObject)
79 {
80     return (bool)((listObject->next == listObject) && (listObject->prev == listObject));
81 }
82 
83 #define OFFSET_OF_FIELD(type, field) ((uintptr_t)((uintptr_t)(&((type *)0x10)->field) - (uintptr_t)0x10))
84 
85 #define COMPLEX_OF(ptr, type, field) ((type *)((uintptr_t)(ptr) - OFFSET_OF_FIELD(type, field)))
86 
87 /* 根据成员地址得到控制块首地址, ptr成员地址, type控制块结构, field成员名 */
88 #define LIST_COMPONENT(ptrOfList, typeOfList, fieldOfList) COMPLEX_OF(ptrOfList, typeOfList, fieldOfList)
89 
90 #define LIST_FOR_EACH(posOfList, listObject, typeOfList, field)                                                    \
91     for ((posOfList) = LIST_COMPONENT((listObject)->next, typeOfList, field); &(posOfList)->field != (listObject); \
92          (posOfList) = LIST_COMPONENT((posOfList)->field.next, typeOfList, field))
93 
94 #define LIST_FOR_EACH_SAFE(posOfList, listObject, typeOfList, field)                \
95     for ((posOfList) = LIST_COMPONENT((listObject)->next, typeOfList, field);       \
96          (&(posOfList)->field != (listObject))&&((posOfList)->field.next != NULL);  \
97          (posOfList) = LIST_COMPONENT((posOfList)->field.next, typeOfList, field))
98 
99 #endif /* PRT_LIST_EXTERNAL_H */
100