#ifndef __LIST__ #define __LIST__ /** * ciruclar double linked list implementation * **/ #include struct list { struct list *next; struct list *prev; }; #define LIST_INIT(name) do { (name)->next = (name); (name)->prev = (name); } while(0); static int inline __list_insert(struct list *prev, struct list *new, struct list *next) { prev->next = new; new->prev = prev; new->next = next; next->prev = new; } static int inline list_insert_after(struct list *list, struct list *new_elem) { return __list_insert(list, new_elem, list->next); } static int inline list_insert_before(struct list *list, struct list *new_elem) { return __list_insert(list->prev, new_elem, list); } static void inline __list_delete(struct list *prev, struct list *elem, struct list *next) { prev->next = next; next->prev = prev; elem->next = elem; elem->prev = elem; } static void inline list_delete(struct list *elem) { __list_delete(elem->prev, elem, elem->next); } #define list_get_prev(elem) (elem)->prev #define list_get_next(elem) (elem)->next #define LIST_FOR_EACH(pos, head) for(pos = head->next; pos != head; pos = pos->next) #define CONTAINER_OF(ptr, type, member) ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member))) #endif