src/slist.h

Go to the documentation of this file.
00001 #ifndef __SLIST_H__
00002 #define __SLIST_H__
00003 #include "prefetch.h"
00004 
00005 /*
00006  * Simple doubly linked list implementation.
00007  *
00008  * Some of the internal functions ("__xxx") are useful when
00009  * manipulating whole lists rather than single entries, as
00010  * sometimes we already know the next/prev entries and we can
00011  * generate better code by using them directly rather than
00012  * using the generic single-entry routines.
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  * Insert a new entry between two known consecutive entries.
00030  *
00031  * This is only for internal list manipulation where we know
00032  * the prev/next entries already!
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  * Delete a list entry by making the prev/next entries
00072  * point to each other.
00073  *
00074  * This is only for internal list manipulation where we know
00075  * the prev/next entries already!
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

Generated on Mon May 28 04:25:25 2007 for BattletechMUX by  doxygen 1.4.7