Home | History | Annotate | Download | only in btt
      1 #ifndef _LINUX_LIST_H
      2 #define _LINUX_LIST_H
      3 
      4 #include <stdio.h>
      5 
      6 #ifndef offsetof
      7 /**
      8  * Get offset of a member
      9  */
     10 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
     11 #endif
     12 
     13 #ifndef container_of
     14 /**
     15  * Casts a member of a structure out to the containing structure
     16  * @param ptr        the pointer to the member.
     17  * @param type       the type of the container struct this is embedded in.
     18  * @param member     the name of the member within the struct.
     19  *
     20  */
     21 #define container_of(ptr, type, member) ({                      \
     22         const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
     23 	        (type *)( (char *)__mptr - offsetof(type,member) );})
     24 #endif
     25 
     26 /*
     27  * These are non-NULL pointers that will result in page faults
     28  * under normal circumstances, used to verify that nobody uses
     29  * non-initialized list entries.
     30  */
     31 #define LIST_POISON1  ((void *) 0x00100100)
     32 #define LIST_POISON2  ((void *) 0x00200200)
     33 
     34 struct list_head {
     35 	struct list_head *next, *prev;
     36 };
     37 
     38 #define LIST_HEAD_INIT(name) { &(name), &(name) }
     39 
     40 #define LIST_HEAD(name) \
     41 	struct list_head name = LIST_HEAD_INIT(name)
     42 
     43 static inline void INIT_LIST_HEAD(struct list_head *list)
     44 {
     45 	list->next = list;
     46 	list->prev = list;
     47 }
     48 
     49 /*
     50  * Insert a new entry between two known consecutive entries.
     51  *
     52  * This is only for internal list manipulation where we know
     53  * the prev/next entries already!
     54  */
     55 static inline void __list_add(struct list_head *new,
     56 			      struct list_head *prev,
     57 			      struct list_head *next)
     58 {
     59 	next->prev = new;
     60 	new->next = next;
     61 	new->prev = prev;
     62 	prev->next = new;
     63 }
     64 
     65 /**
     66  * list_add - add a new entry
     67  * @new: new entry to be added
     68  * @head: list head to add it after
     69  *
     70  * Insert a new entry after the specified head.
     71  * This is good for implementing stacks.
     72  */
     73 static inline void list_add(struct list_head *new, struct list_head *head)
     74 {
     75 	__list_add(new, head, head->next);
     76 }
     77 
     78 /**
     79  * list_add_tail - add a new entry
     80  * @new: new entry to be added
     81  * @head: list head to add it before
     82  *
     83  * Insert a new entry before the specified head.
     84  * This is useful for implementing queues.
     85  */
     86 static inline void list_add_tail(struct list_head *new, struct list_head *head)
     87 {
     88 	__list_add(new, head->prev, head);
     89 }
     90 
     91 /*
     92  * Delete a list entry by making the prev/next entries
     93  * point to each other.
     94  *
     95  * This is only for internal list manipulation where we know
     96  * the prev/next entries already!
     97  */
     98 static inline void __list_del(struct list_head * prev, struct list_head * next)
     99 {
    100 	next->prev = prev;
    101 	prev->next = next;
    102 }
    103 
    104 /**
    105  * list_del - deletes entry from list.
    106  * @entry: the element to delete from the list.
    107  * Note: list_empty on entry does not return true after this, the entry is
    108  * in an undefined state.
    109  */
    110 static inline void list_del(struct list_head *entry)
    111 {
    112 	__list_del(entry->prev, entry->next);
    113 	entry->next = LIST_POISON1;
    114 	entry->prev = LIST_POISON2;
    115 }
    116 
    117 /**
    118  * __list_for_each	-	iterate over a list
    119  * @pos:	the &struct list_head to use as a loop counter.
    120  * @head:	the head for your list.
    121  *
    122  * This variant differs from list_for_each() in that it's the
    123  * simplest possible list iteration code, no prefetching is done.
    124  * Use this for code that knows the list to be very short (empty
    125  * or 1 entry) most of the time.
    126  */
    127 #define __list_for_each(pos, head) \
    128 	for (pos = (head)->next; pos != (head); pos = pos->next)
    129 
    130 /**
    131  * list_for_each_safe	-	iterate over a list safe against removal of list entry
    132  * @pos:	the &struct list_head to use as a loop counter.
    133  * @n:		another &struct list_head to use as temporary storage
    134  * @head:	the head for your list.
    135  */
    136 #define list_for_each_safe(pos, n, head) \
    137 	for (pos = (head)->next, n = pos->next; pos != (head); \
    138 		pos = n, n = pos->next)
    139 
    140 /**
    141  * list_entry - get the struct for this entry
    142  * @ptr:        the &struct list_head pointer.
    143  * @type:       the type of the struct this is embedded in.
    144  * @member:     the name of the list_struct within the struct.
    145  */
    146 #define list_entry(ptr, type, member) \
    147         container_of(ptr, type, member)
    148 
    149 static inline int list_len(struct list_head *head_p)
    150 {
    151 	struct list_head *p;
    152 	int n = 0;
    153 
    154 	__list_for_each(p, head_p) {
    155 		n++;
    156 	}
    157 
    158 	return n;
    159 }
    160 
    161 /**
    162  * list_empty - tests whether a list is empty
    163  * @head: the list to test.
    164  */
    165 static inline int list_empty(const struct list_head *head)
    166 {
    167 	return head->next == head;
    168 }
    169 
    170 /**
    171  * list_first - Returns first entry on list, or NULL if empty
    172  * @head: the list
    173  */
    174 static inline struct list_head *list_first(const struct list_head *head)
    175 {
    176 	return list_empty(head) ? NULL : head->next;
    177 }
    178 
    179 /**
    180  * list_move_tail - delete from one list and add as another's tail
    181  * @list: the entry to move
    182  * @head: the head that will follow our entry
    183  */
    184 static inline void list_move_tail(struct list_head *list,
    185 				  struct list_head *head)
    186 {
    187         __list_del(list->prev, list->next);
    188         list_add_tail(list, head);
    189 }
    190 
    191 static inline void __list_splice(struct list_head *list,
    192                                  struct list_head *head)
    193 {
    194         struct list_head *first = list->next;
    195         struct list_head *last = list->prev;
    196         struct list_head *at = head->next;
    197 
    198         first->prev = head;
    199         head->next = first;
    200 
    201         last->next = at;
    202         at->prev = last;
    203 }
    204 
    205 /**
    206  *  * list_splice - join two lists
    207  *   * @list: the new list to add.
    208  *    * @head: the place to add it in the first list.
    209  *     */
    210 static inline void list_splice(struct list_head *list, struct list_head *head)
    211 {
    212         if (!list_empty(list))
    213                 __list_splice(list, head);
    214 }
    215 
    216 /**
    217  * list_replace - replace old entry by new one
    218  * @old : the element to be replaced
    219  * @new : the new element to insert
    220  *
    221  * If @old was empty, it will be overwritten.
    222  */
    223 static inline void list_replace(struct list_head *old,
    224 				struct list_head *new)
    225 {
    226 	new->next = old->next;
    227 	new->next->prev = new;
    228 	new->prev = old->prev;
    229 	new->prev->next = new;
    230 }
    231 
    232 static inline void list_replace_init(struct list_head *old,
    233 					struct list_head *new)
    234 {
    235 	list_replace(old, new);
    236 	INIT_LIST_HEAD(old);
    237 }
    238 
    239 #endif
    240