| 
									
										
										
										
											2010-07-22 11:58:05 +02:00
										 |  |  | struct list { | 
					
						
							| 
									
										
										
										
											2010-07-22 11:58:05 +02:00
										 |  |  | 	struct list *next, *prev; | 
					
						
							| 
									
										
										
										
											2010-07-22 11:58:05 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void | 
					
						
							|  |  |  | list_init(struct list *list) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-07-22 11:58:05 +02:00
										 |  |  | 	list->next = list; | 
					
						
							|  |  |  | 	list->prev = list; | 
					
						
							| 
									
										
										
										
											2010-07-22 11:58:05 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline int | 
					
						
							|  |  |  | list_empty(struct list *list) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-07-22 11:58:05 +02:00
										 |  |  | 	return list->next == list; | 
					
						
							| 
									
										
										
										
											2010-07-22 11:58:05 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void | 
					
						
							|  |  |  | list_insert(struct list *link, struct list *new_link) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-07-22 11:58:05 +02:00
										 |  |  | 	new_link->prev		= link->prev; | 
					
						
							|  |  |  | 	new_link->next		= link; | 
					
						
							|  |  |  | 	new_link->prev->next	= new_link; | 
					
						
							|  |  |  | 	new_link->next->prev	= new_link; | 
					
						
							| 
									
										
										
										
											2010-07-22 11:58:05 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void | 
					
						
							|  |  |  | list_append(struct list *list, struct list *new_link) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-07-22 11:58:05 +02:00
										 |  |  | 	list_insert((struct list *)list, new_link); | 
					
						
							| 
									
										
										
										
											2010-07-22 11:58:05 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void | 
					
						
							|  |  |  | list_prepend(struct list *list, struct list *new_link) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-07-22 11:58:05 +02:00
										 |  |  | 	list_insert(list->next, new_link); | 
					
						
							| 
									
										
										
										
											2010-07-22 11:58:05 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void | 
					
						
							|  |  |  | list_remove(struct list *link) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-07-22 11:58:05 +02:00
										 |  |  | 	link->prev->next = link->next; | 
					
						
							|  |  |  | 	link->next->prev = link->prev; | 
					
						
							| 
									
										
										
										
											2010-07-22 11:58:05 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define list_entry(link, type, member) \
 | 
					
						
							|  |  |  | 	((type *)((char *)(link)-(unsigned long)(&((type *)0)->member))) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define list_head(list, type, member)		\
 | 
					
						
							|  |  |  | 	list_entry((list)->next, type, member) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define list_tail(list, type, member)		\
 | 
					
						
							|  |  |  | 	list_entry((list)->prev, type, member) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define list_next(elm, member)					\
 | 
					
						
							|  |  |  | 	list_entry((elm)->member.next, typeof(*elm), member) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define list_for_each_entry(pos, list, member)			\
 | 
					
						
							|  |  |  | 	for (pos = list_head(list, typeof(*pos), member);	\ | 
					
						
							|  |  |  | 	     &pos->member != (list);				\ | 
					
						
							|  |  |  | 	     pos = list_next(pos, member)) | 
					
						
							|  |  |  | 
 |