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