1 // SPDX-FileCopyrightText: 2002 Free Software Foundation, Inc.
2 // SPDX-FileCopyrightText: 2009 Pierre-Marc Fournier
3 // SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 // SPDX-License-Identifier: LGPL-2.1-or-later
8 * (originally part of the GNU C Library)
9 * Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
16 * container_of - Get the address of an object containing a field.
18 * @ptr: pointer to the field.
19 * @type: type of the object.
20 * @member: name of the field within the object.
22 #define container_of(ptr, type, member) \
25 const __typeof__(((type *) NULL)->member) * __ptr = (ptr); \
26 (type *)((char *)__ptr - offsetof(type, member)); \
30 * The definitions of this file are adopted from those which can be
31 * found in the Linux kernel headers to enable people familiar with the
32 * latter find their way in these sources as well.
35 /* Basic type for the double-link list. */
37 struct list_head
*next
, *prev
;
40 /* Define a variable with the head and tail of the list. */
41 #define LIST_HEAD(name) \
42 struct list_head name = { &(name), &(name) }
44 /* Initialize a new list head. */
45 #define INIT_LIST_HEAD(ptr) \
46 (ptr)->next = (ptr)->prev = (ptr)
48 #define LIST_HEAD_INIT(name) { .next = &(name), .prev = &(name) }
50 /* Add new element at the head of the list. */
52 void list_add(struct list_head
*newp
, struct list_head
*head
)
54 head
->next
->prev
= newp
;
55 newp
->next
= head
->next
;
60 /* Add new element at the tail of the list. */
62 void list_add_tail(struct list_head
*newp
, struct list_head
*head
)
64 head
->prev
->next
= newp
;
66 newp
->prev
= head
->prev
;
70 /* Remove element from list. */
72 void __list_del(struct list_head
*prev
, struct list_head
*next
)
78 /* Remove element from list. */
80 void list_del(struct list_head
*elem
)
82 __list_del(elem
->prev
, elem
->next
);
85 /* Remove element from list, initializing the element's list pointers. */
87 void list_del_init(struct list_head
*elem
)
93 /* Delete from list, add to another list as head. */
95 void list_move(struct list_head
*elem
, struct list_head
*head
)
97 __list_del(elem
->prev
, elem
->next
);
101 /* Replace an old entry. */
103 void list_replace(struct list_head
*old
, struct list_head
*_new
)
105 _new
->next
= old
->next
;
106 _new
->prev
= old
->prev
;
107 _new
->prev
->next
= _new
;
108 _new
->next
->prev
= _new
;
111 /* Join two lists. */
113 void list_splice(struct list_head
*add
, struct list_head
*head
)
115 /* Do nothing if the list which gets added is empty. */
116 if (add
!= add
->next
) {
117 add
->next
->prev
= head
;
118 add
->prev
->next
= head
->next
;
119 head
->next
->prev
= add
->prev
;
120 head
->next
= add
->next
;
124 /* Get typed element from list at a given position. */
125 #define list_entry(ptr, type, member) container_of(ptr, type, member)
127 /* Get first entry from a list. */
128 #define list_first_entry(ptr, type, member) \
129 list_entry((ptr)->next, type, member)
131 /* Iterate forward over the elements of the list. */
132 #define list_for_each(pos, head) \
133 for (pos = (head)->next; (pos) != (head); pos = (pos)->next)
136 * Iterate forward over the elements list. The list elements can be
137 * removed from the list while doing this.
139 #define list_for_each_safe(pos, p, head) \
140 for (pos = (head)->next, p = (pos)->next; \
142 pos = (p), p = (pos)->next)
144 /* Iterate backward over the elements of the list. */
145 #define list_for_each_prev(pos, head) \
146 for (pos = (head)->prev; (pos) != (head); pos = (pos)->prev)
149 * Iterate backwards over the elements list. The list elements can be
150 * removed from the list while doing this.
152 #define list_for_each_prev_safe(pos, p, head) \
153 for (pos = (head)->prev, p = (pos)->prev; \
155 pos = (p), p = (pos)->prev)
157 #define list_for_each_entry(pos, head, member) \
158 for (pos = list_entry((head)->next, __typeof__(*(pos)), member); \
159 &(pos)->member != (head); \
160 pos = list_entry((pos)->member.next, __typeof__(*(pos)), member))
162 #define list_for_each_entry_reverse(pos, head, member) \
163 for (pos = list_entry((head)->prev, __typeof__(*(pos)), member); \
164 &(pos)->member != (head); \
165 pos = list_entry((pos)->member.prev, __typeof__(*(pos)), member))
167 #define list_for_each_entry_safe(pos, p, head, member) \
168 for (pos = list_entry((head)->next, __typeof__(*(pos)), member), \
169 p = list_entry((pos)->member.next, __typeof__(*(pos)), member); \
170 &(pos)->member != (head); \
171 pos = (p), p = list_entry((pos)->member.next, __typeof__(*(pos)), member))
174 * Same as list_for_each_entry_safe, but starts from "pos" which should
175 * point to an entry within the list.
177 #define list_for_each_entry_safe_from(pos, p, head, member) \
178 for (p = list_entry((pos)->member.next, __typeof__(*(pos)), member); \
179 &(pos)->member != (head); \
180 pos = (p), p = list_entry((pos)->member.next, __typeof__(*(pos)), member))
183 int list_empty(struct list_head
*head
)
185 return head
== head
->next
;
189 void list_replace_init(struct list_head
*old
, struct list_head
*_new
)
191 struct list_head
*head
= old
->next
;
194 list_add_tail(_new
, head
);
This page took 0.039035 seconds and 4 git commands to generate.