00001 #ifndef _LINUX_LIST_H 00002 #define _LINUX_LIST_H 00003 00004 struct list_head { 00005 struct list_head *next, *prev; 00006 }; 00007 00008 #define LIST_HEAD_INIT(name) { &(name), &(name) } 00009 00010 #define LIST_HEAD(name) \ 00011 struct list_head name = LIST_HEAD_INIT(name) 00012 00013 static inline void INIT_LIST_HEAD(struct list_head *list) 00014 { 00015 list->next = list; 00016 list->prev = list; 00017 } 00018 00025 static inline void __list_add(struct list_head *newptr, 00026 struct list_head *prev, 00027 struct list_head *next) 00028 { 00029 next->prev = newptr; 00030 newptr->next = next; 00031 newptr->prev = prev; 00032 prev->next = newptr; 00033 } 00034 00043 static inline void list_add(struct list_head *newptr, struct list_head *head) 00044 { 00045 __list_add(newptr, head, head->next); 00046 } 00047 00056 static inline void list_add_tail(struct list_head *newptr, struct list_head *head) 00057 { 00058 __list_add(newptr, head->prev, head); 00059 } 00060 00068 static inline void __list_del(struct list_head * prev, struct list_head * next) 00069 { 00070 next->prev = prev; 00071 prev->next = next; 00072 } 00073 00080 static inline void list_del(struct list_head *entry) 00081 { 00082 __list_del(entry->prev, entry->next); 00083 entry->next = 0; 00084 entry->prev = 0; 00085 } 00086 00094 static inline void list_replace(struct list_head *old, 00095 struct list_head *newptr) 00096 { 00097 newptr->next = old->next; 00098 newptr->next->prev = newptr; 00099 newptr->prev = old->prev; 00100 newptr->prev->next = newptr; 00101 } 00102 00103 static inline void list_replace_init(struct list_head *old, 00104 struct list_head *newptr) 00105 { 00106 list_replace(old, newptr); 00107 INIT_LIST_HEAD(old); 00108 } 00109 00114 static inline void list_del_init(struct list_head *entry) 00115 { 00116 __list_del(entry->prev, entry->next); 00117 INIT_LIST_HEAD(entry); 00118 } 00119 00125 static inline void list_move(struct list_head *list, struct list_head *head) 00126 { 00127 __list_del(list->prev, list->next); 00128 list_add(list, head); 00129 } 00130 00136 static inline void list_move_tail(struct list_head *list, 00137 struct list_head *head) 00138 { 00139 __list_del(list->prev, list->next); 00140 list_add_tail(list, head); 00141 } 00142 00148 static inline int list_is_last(const struct list_head *list, 00149 const struct list_head *head) 00150 { 00151 return list->next == head; 00152 } 00153 00158 static inline int list_empty(const struct list_head *head) 00159 { 00160 return head->next == head; 00161 } 00162 00169 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 00170 00171 #define container_of(ptr, type, member) ({ \ 00172 const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 00173 (type *)( (char *)__mptr - offsetof(type,member) );}) 00174 00175 #define list_entry(ptr, type, member) \ 00176 container_of(ptr, type, member) 00177 00186 #define list_first_entry(ptr, type, member) \ 00187 list_entry((ptr)->next, type, member) 00188 00194 #define list_for_each(pos, head) \ 00195 for (pos = (head)->next; pos != (head); \ 00196 pos = pos->next) 00197 00203 #define list_for_each_prev(pos, head) \ 00204 for (pos = (head)->prev; pos != (head); \ 00205 pos = pos->prev) 00206 00213 #define list_for_each_entry(pos, head, member) \ 00214 for (pos = list_entry((head)->next, typeof(*pos), member); \ 00215 &pos->member != (head); \ 00216 pos = list_entry(pos->member.next, typeof(*pos), member)) 00217 00224 #define list_for_each_entry_reverse(pos, head, member) \ 00225 for (pos = list_entry((head)->prev, typeof(*pos), member); \ 00226 &pos->member != (head); \ 00227 pos = list_entry(pos->member.prev, typeof(*pos), member)) 00228 00237 #define list_prepare_entry(pos, head, member) \ 00238 ((pos) ? : list_entry(head, typeof(*pos), member)) 00239 00240 #endif