00001 #ifndef __SLIST_H__
00002 #define __SLIST_H__
00003 #include "prefetch.h"
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 struct list_head {
00016 struct list_head *next, *prev;
00017 };
00018
00019 #define LIST_HEAD_INIT(name) { &(name), &(name) }
00020
00021 #define LIST_HEAD(name) \
00022 struct list_head name = LIST_HEAD_INIT(name)
00023
00024 #define INIT_LIST_HEAD(ptr) do { \
00025 (ptr)->next = (ptr); (ptr)->prev = (ptr); \
00026 } while (0)
00027
00028
00029
00030
00031
00032
00033
00034 static inline void __list_add(struct list_head *new,
00035 struct list_head *prev,
00036 struct list_head *next)
00037 {
00038 next->prev = new;
00039 new->next = next;
00040 new->prev = prev;
00041 prev->next = new;
00042 }
00043
00052 static inline void list_add(struct list_head *new, struct list_head *head)
00053 {
00054 __list_add(new, head, head->next);
00055 }
00056
00065 static inline void list_add_tail(struct list_head *new, struct list_head *head)
00066 {
00067 __list_add(new, head->prev, head);
00068 }
00069
00070
00071
00072
00073
00074
00075
00076
00077 static inline void __list_del(struct list_head * prev, struct list_head * next)
00078 {
00079 next->prev = prev;
00080 prev->next = next;
00081 }
00082
00089 static inline void list_del(struct list_head *entry)
00090 {
00091 __list_del(entry->prev, entry->next);
00092 entry->next = LIST_POISON1;
00093 entry->prev = LIST_POISON2;
00094 }
00095
00100 static inline void list_del_init(struct list_head *entry)
00101 {
00102 __list_del(entry->prev, entry->next);
00103 INIT_LIST_HEAD(entry);
00104 }
00105
00111 static inline void list_move(struct list_head *list, struct list_head *head)
00112 {
00113 __list_del(list->prev, list->next);
00114 list_add(list, head);
00115 }
00116
00122 static inline void list_move_tail(struct list_head *list,
00123 struct list_head *head)
00124 {
00125 __list_del(list->prev, list->next);
00126 list_add_tail(list, head);
00127 }
00128
00133 static inline int list_empty(const struct list_head *head)
00134 {
00135 return head->next == head;
00136 }
00137
00138 static inline void __list_splice(struct list_head *list,
00139 struct list_head *head)
00140 {
00141 struct list_head *first = list->next;
00142 struct list_head *last = list->prev;
00143 struct list_head *at = head->next;
00144
00145 first->prev = head;
00146 head->next = first;
00147
00148 last->next = at;
00149 at->prev = last;
00150 }
00151
00157 static inline void list_splice(struct list_head *list, struct list_head *head)
00158 {
00159 if (!list_empty(list))
00160 __list_splice(list, head);
00161 }
00162
00170 static inline void list_splice_init(struct list_head *list,
00171 struct list_head *head)
00172 {
00173 if (!list_empty(list)) {
00174 __list_splice(list, head);
00175 INIT_LIST_HEAD(list);
00176 }
00177 }
00178
00185 #define list_entry(ptr, type, member) \
00186 container_of(ptr, type, member)
00187
00193 #define list_for_each(pos, head) \
00194 for (pos = (head)->next; prefetch(pos->next), pos != (head); \
00195 pos = pos->next)
00196
00207 #define __list_for_each(pos, head) \
00208 for (pos = (head)->next; pos != (head); pos = pos->next)
00209
00215 #define list_for_each_prev(pos, head) \
00216 for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \
00217 pos = pos->prev)
00218
00225 #define list_for_each_safe(pos, n, head) \
00226 for (pos = (head)->next, n = pos->next; pos != (head); \
00227 pos = n, n = pos->next)
00228
00235 #define list_for_each_entry(pos, head, member) \
00236 for (pos = list_entry((head)->next, typeof(*pos), member); \
00237 prefetch(pos->member.next), &pos->member != (head); \
00238 pos = list_entry(pos->member.next, typeof(*pos), member))
00239
00246 #define list_for_each_entry_reverse(pos, head, member) \
00247 for (pos = list_entry((head)->prev, typeof(*pos), member); \
00248 prefetch(pos->member.prev), &pos->member != (head); \
00249 pos = list_entry(pos->member.prev, typeof(*pos), member))
00250
00258 #define list_prepare_entry(pos, head, member) \
00259 ((pos) ? : list_entry(head, typeof(*pos), member))
00260
00268 #define list_for_each_entry_continue(pos, head, member) \
00269 for (pos = list_entry(pos->member.next, typeof(*pos), member); \
00270 prefetch(pos->member.next), &pos->member != (head); \
00271 pos = list_entry(pos->member.next, typeof(*pos), member))
00272
00280 #define list_for_each_entry_safe(pos, n, head, member) \
00281 for (pos = list_entry((head)->next, typeof(*pos), member), \
00282 n = list_entry(pos->member.next, typeof(*pos), member); \
00283 &pos->member != (head); \
00284 pos = n, n = list_entry(n->member.next, typeof(*n), member))
00285
00294 #define list_for_each_entry_safe_continue(pos, n, head, member) \
00295 for (pos = list_entry(pos->member.next, typeof(*pos), member), \
00296 n = list_entry(pos->member.next, typeof(*pos), member); \
00297 &pos->member != (head); \
00298 pos = n, n = list_entry(n->member.next, typeof(*n), member))
00299
00300 #endif