1*58e6ee5fSAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1 */
2*58e6ee5fSAndroid Build Coastguard Worker /*
3*58e6ee5fSAndroid Build Coastguard Worker * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <[email protected]>
4*58e6ee5fSAndroid Build Coastguard Worker *
5*58e6ee5fSAndroid Build Coastguard Worker */
6*58e6ee5fSAndroid Build Coastguard Worker #ifndef __LIST_H
7*58e6ee5fSAndroid Build Coastguard Worker #define __LIST_H
8*58e6ee5fSAndroid Build Coastguard Worker
9*58e6ee5fSAndroid Build Coastguard Worker #define offset_of(type, field) __builtin_offsetof(type, field)
10*58e6ee5fSAndroid Build Coastguard Worker #define container_of(p, type, field) (type *)((long)p - offset_of(type, field))
11*58e6ee5fSAndroid Build Coastguard Worker
12*58e6ee5fSAndroid Build Coastguard Worker struct list_head {
13*58e6ee5fSAndroid Build Coastguard Worker struct list_head *next;
14*58e6ee5fSAndroid Build Coastguard Worker struct list_head *prev;
15*58e6ee5fSAndroid Build Coastguard Worker };
16*58e6ee5fSAndroid Build Coastguard Worker
list_head_init(struct list_head * list)17*58e6ee5fSAndroid Build Coastguard Worker static inline void list_head_init(struct list_head *list)
18*58e6ee5fSAndroid Build Coastguard Worker {
19*58e6ee5fSAndroid Build Coastguard Worker list->next = list;
20*58e6ee5fSAndroid Build Coastguard Worker list->prev = list;
21*58e6ee5fSAndroid Build Coastguard Worker }
22*58e6ee5fSAndroid Build Coastguard Worker
list_add(struct list_head * p,struct list_head * head)23*58e6ee5fSAndroid Build Coastguard Worker static inline void list_add(struct list_head *p, struct list_head *head)
24*58e6ee5fSAndroid Build Coastguard Worker {
25*58e6ee5fSAndroid Build Coastguard Worker struct list_head *next = head->next;
26*58e6ee5fSAndroid Build Coastguard Worker
27*58e6ee5fSAndroid Build Coastguard Worker p->prev = head;
28*58e6ee5fSAndroid Build Coastguard Worker p->next = next;
29*58e6ee5fSAndroid Build Coastguard Worker next->prev = p;
30*58e6ee5fSAndroid Build Coastguard Worker head->next = p;
31*58e6ee5fSAndroid Build Coastguard Worker }
32*58e6ee5fSAndroid Build Coastguard Worker
list_add_tail(struct list_head * p,struct list_head * head)33*58e6ee5fSAndroid Build Coastguard Worker static inline void list_add_tail(struct list_head *p, struct list_head *head)
34*58e6ee5fSAndroid Build Coastguard Worker {
35*58e6ee5fSAndroid Build Coastguard Worker struct list_head *prev = head->prev;
36*58e6ee5fSAndroid Build Coastguard Worker
37*58e6ee5fSAndroid Build Coastguard Worker p->prev = prev;
38*58e6ee5fSAndroid Build Coastguard Worker p->next = head;
39*58e6ee5fSAndroid Build Coastguard Worker prev->next = p;
40*58e6ee5fSAndroid Build Coastguard Worker head->prev = p;
41*58e6ee5fSAndroid Build Coastguard Worker }
42*58e6ee5fSAndroid Build Coastguard Worker
list_del(struct list_head * p)43*58e6ee5fSAndroid Build Coastguard Worker static inline void list_del(struct list_head *p)
44*58e6ee5fSAndroid Build Coastguard Worker {
45*58e6ee5fSAndroid Build Coastguard Worker struct list_head *next = p->next;
46*58e6ee5fSAndroid Build Coastguard Worker struct list_head *prev = p->prev;
47*58e6ee5fSAndroid Build Coastguard Worker
48*58e6ee5fSAndroid Build Coastguard Worker next->prev = prev;
49*58e6ee5fSAndroid Build Coastguard Worker prev->next = next;
50*58e6ee5fSAndroid Build Coastguard Worker }
51*58e6ee5fSAndroid Build Coastguard Worker
list_empty(struct list_head * list)52*58e6ee5fSAndroid Build Coastguard Worker static inline int list_empty(struct list_head *list)
53*58e6ee5fSAndroid Build Coastguard Worker {
54*58e6ee5fSAndroid Build Coastguard Worker return list->next == list;
55*58e6ee5fSAndroid Build Coastguard Worker }
56*58e6ee5fSAndroid Build Coastguard Worker
57*58e6ee5fSAndroid Build Coastguard Worker #define list_for_each_entry(p, list, field) \
58*58e6ee5fSAndroid Build Coastguard Worker for (p = container_of((list)->next, typeof(*p), field); \
59*58e6ee5fSAndroid Build Coastguard Worker &(p)->field != list; \
60*58e6ee5fSAndroid Build Coastguard Worker p = container_of((p)->field.next, typeof(*p), field))
61*58e6ee5fSAndroid Build Coastguard Worker
62*58e6ee5fSAndroid Build Coastguard Worker #define list_for_each_entry_safe(p, n, list, field) \
63*58e6ee5fSAndroid Build Coastguard Worker for (p = container_of((list)->next, typeof(*p), field), \
64*58e6ee5fSAndroid Build Coastguard Worker n = container_of((p)->field.next, typeof(*p), field); \
65*58e6ee5fSAndroid Build Coastguard Worker &(p)->field != list; \
66*58e6ee5fSAndroid Build Coastguard Worker p = n, n = container_of((p)->field.next, typeof(*p), field))
67*58e6ee5fSAndroid Build Coastguard Worker
68*58e6ee5fSAndroid Build Coastguard Worker #endif /* __LIST_H */
69