1169695Skan/* 2169695Skan * $FreeBSD$ 3169695Skan * 4169695Skan * linux-like bidirectional lists 5169695Skan */ 6169695Skan 7169695Skan#ifndef _MYLIST_H 8169695Skan#define _MYLIST_H 9169695Skanstruct list_head { 10169695Skan struct list_head *prev, *next; 11169695Skan}; 12169695Skan 13169695Skan#define INIT_LIST_HEAD(l) do { (l)->prev = (l)->next = (l); } while (0) 14169695Skan#define list_empty(l) ( (l)->next == l ) 15169695Skanstatic inline void 16169695Skan__list_add(struct list_head *o, struct list_head *prev, 17169695Skan struct list_head *next) 18169695Skan{ 19169695Skan next->prev = o; 20169695Skan o->next = next; 21169695Skan o->prev = prev; 22169695Skan prev->next = o; 23169695Skan} 24169695Skan 25169695Skanstatic inline void 26169695Skanlist_add_tail(struct list_head *o, struct list_head *head) 27169695Skan{ 28169695Skan __list_add(o, head->prev, head); 29169695Skan} 30169695Skan 31169695Skan#define list_first_entry(pL, ty, member) \ 32169695Skan (ty *)((char *)((pL)->next) - offsetof(ty, member)) 33169695Skan 34169695Skanstatic inline void 35169695Skan__list_del(struct list_head *prev, struct list_head *next) 36169695Skan{ 37169695Skan next->prev = prev; 38169695Skan prev->next = next; 39169695Skan} 40169695Skan 41169695Skanstatic inline void 42169695Skanlist_del(struct list_head *entry) 43169695Skan{ 44169695Skan ND("called on %p", entry); 45169695Skan __list_del(entry->prev, entry->next); 46169695Skan entry->next = entry->prev = NULL; 47169695Skan} 48169695Skan 49169695Skan#endif /* _MYLIST_H */ 50169695Skan