| Benjamin Poirier | bad9955 | 2012-10-21 05:27:53 -0400 | [diff] [blame] | 1 | #ifndef LIST_H | 
|  | 2 | #define LIST_H | 
|  | 3 |  | 
|  | 4 | /* | 
|  | 5 | * Copied from include/linux/... | 
|  | 6 | */ | 
|  | 7 |  | 
|  | 8 | #undef offsetof | 
|  | 9 | #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) | 
|  | 10 |  | 
|  | 11 | /** | 
|  | 12 | * container_of - cast a member of a structure out to the containing structure | 
|  | 13 | * @ptr:        the pointer to the member. | 
|  | 14 | * @type:       the type of the container struct this is embedded in. | 
|  | 15 | * @member:     the name of the member within the struct. | 
|  | 16 | * | 
|  | 17 | */ | 
|  | 18 | #define container_of(ptr, type, member) ({                      \ | 
|  | 19 | const typeof( ((type *)0)->member ) *__mptr = (ptr);    \ | 
|  | 20 | (type *)( (char *)__mptr - offsetof(type,member) );}) | 
|  | 21 |  | 
|  | 22 |  | 
|  | 23 | struct list_head { | 
|  | 24 | struct list_head *next, *prev; | 
|  | 25 | }; | 
|  | 26 |  | 
|  | 27 |  | 
|  | 28 | #define LIST_HEAD_INIT(name) { &(name), &(name) } | 
|  | 29 |  | 
|  | 30 | #define LIST_HEAD(name) \ | 
|  | 31 | struct list_head name = LIST_HEAD_INIT(name) | 
|  | 32 |  | 
|  | 33 | /** | 
|  | 34 | * list_entry - get the struct for this entry | 
|  | 35 | * @ptr:	the &struct list_head pointer. | 
|  | 36 | * @type:	the type of the struct this is embedded in. | 
|  | 37 | * @member:	the name of the list_struct within the struct. | 
|  | 38 | */ | 
|  | 39 | #define list_entry(ptr, type, member) \ | 
|  | 40 | container_of(ptr, type, member) | 
|  | 41 |  | 
|  | 42 | /** | 
|  | 43 | * list_for_each_entry	-	iterate over list of given type | 
|  | 44 | * @pos:	the type * to use as a loop cursor. | 
|  | 45 | * @head:	the head for your list. | 
|  | 46 | * @member:	the name of the list_struct within the struct. | 
|  | 47 | */ | 
|  | 48 | #define list_for_each_entry(pos, head, member)				\ | 
|  | 49 | for (pos = list_entry((head)->next, typeof(*pos), member);	\ | 
|  | 50 | &pos->member != (head); 	\ | 
|  | 51 | pos = list_entry(pos->member.next, typeof(*pos), member)) | 
|  | 52 |  | 
|  | 53 | /** | 
| Benjamin Poirier | edb749f | 2013-04-15 10:13:50 -0400 | [diff] [blame] | 54 | * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry | 
|  | 55 | * @pos:	the type * to use as a loop cursor. | 
|  | 56 | * @n:		another type * to use as temporary storage | 
|  | 57 | * @head:	the head for your list. | 
|  | 58 | * @member:	the name of the list_struct within the struct. | 
|  | 59 | */ | 
|  | 60 | #define list_for_each_entry_safe(pos, n, head, member)			\ | 
|  | 61 | for (pos = list_entry((head)->next, typeof(*pos), member),	\ | 
|  | 62 | n = list_entry(pos->member.next, typeof(*pos), member);	\ | 
|  | 63 | &pos->member != (head);					\ | 
|  | 64 | pos = n, n = list_entry(n->member.next, typeof(*n), member)) | 
|  | 65 |  | 
|  | 66 | /** | 
| Benjamin Poirier | bad9955 | 2012-10-21 05:27:53 -0400 | [diff] [blame] | 67 | * list_empty - tests whether a list is empty | 
|  | 68 | * @head: the list to test. | 
|  | 69 | */ | 
|  | 70 | static inline int list_empty(const struct list_head *head) | 
|  | 71 | { | 
|  | 72 | return head->next == head; | 
|  | 73 | } | 
|  | 74 |  | 
|  | 75 | /* | 
|  | 76 | * Insert a new entry between two known consecutive entries. | 
|  | 77 | * | 
|  | 78 | * This is only for internal list manipulation where we know | 
|  | 79 | * the prev/next entries already! | 
|  | 80 | */ | 
|  | 81 | static inline void __list_add(struct list_head *_new, | 
|  | 82 | struct list_head *prev, | 
|  | 83 | struct list_head *next) | 
|  | 84 | { | 
|  | 85 | next->prev = _new; | 
|  | 86 | _new->next = next; | 
|  | 87 | _new->prev = prev; | 
|  | 88 | prev->next = _new; | 
|  | 89 | } | 
|  | 90 |  | 
|  | 91 | /** | 
|  | 92 | * list_add_tail - add a new entry | 
|  | 93 | * @new: new entry to be added | 
|  | 94 | * @head: list head to add it before | 
|  | 95 | * | 
|  | 96 | * Insert a new entry before the specified head. | 
|  | 97 | * This is useful for implementing queues. | 
|  | 98 | */ | 
|  | 99 | static inline void list_add_tail(struct list_head *_new, struct list_head *head) | 
|  | 100 | { | 
|  | 101 | __list_add(_new, head->prev, head); | 
|  | 102 | } | 
|  | 103 |  | 
| Benjamin Poirier | 9a69abf | 2013-04-16 10:07:23 -0400 | [diff] [blame] | 104 | /* | 
|  | 105 | * Delete a list entry by making the prev/next entries | 
|  | 106 | * point to each other. | 
|  | 107 | * | 
|  | 108 | * This is only for internal list manipulation where we know | 
|  | 109 | * the prev/next entries already! | 
|  | 110 | */ | 
|  | 111 | static inline void __list_del(struct list_head *prev, struct list_head *next) | 
|  | 112 | { | 
|  | 113 | next->prev = prev; | 
|  | 114 | prev->next = next; | 
|  | 115 | } | 
|  | 116 |  | 
|  | 117 | #define LIST_POISON1  ((void *) 0x00100100) | 
|  | 118 | #define LIST_POISON2  ((void *) 0x00200200) | 
|  | 119 | /** | 
|  | 120 | * list_del - deletes entry from list. | 
|  | 121 | * @entry: the element to delete from the list. | 
|  | 122 | * Note: list_empty() on entry does not return true after this, the entry is | 
|  | 123 | * in an undefined state. | 
|  | 124 | */ | 
|  | 125 | static inline void list_del(struct list_head *entry) | 
|  | 126 | { | 
|  | 127 | __list_del(entry->prev, entry->next); | 
| Yann E. MORIN | 21ca352 | 2013-04-29 19:50:32 +0200 | [diff] [blame] | 128 | entry->next = (struct list_head*)LIST_POISON1; | 
|  | 129 | entry->prev = (struct list_head*)LIST_POISON2; | 
| Benjamin Poirier | 9a69abf | 2013-04-16 10:07:23 -0400 | [diff] [blame] | 130 | } | 
| Benjamin Poirier | bad9955 | 2012-10-21 05:27:53 -0400 | [diff] [blame] | 131 | #endif |