1204591Sluigi/* 2204591Sluigi * $FreeBSD$ 3204591Sluigi * 4204591Sluigi * linux-like bidirectional lists 5204591Sluigi */ 6204591Sluigi 7204591Sluigi#ifndef _MYLIST_H 8204591Sluigi#define _MYLIST_H 9204591Sluigistruct list_head { 10204591Sluigi struct list_head *prev, *next; 11204591Sluigi}; 12204591Sluigi 13204591Sluigi#define INIT_LIST_HEAD(l) do { (l)->prev = (l)->next = (l); } while (0) 14204591Sluigi#define list_empty(l) ( (l)->next == l ) 15204591Sluigistatic inline void 16204735Sluigi__list_add(struct list_head *o, struct list_head *prev, 17204591Sluigi struct list_head *next) 18204591Sluigi{ 19204735Sluigi next->prev = o; 20204735Sluigi o->next = next; 21204735Sluigi o->prev = prev; 22204735Sluigi prev->next = o; 23204591Sluigi} 24204591Sluigi 25204591Sluigistatic inline void 26204735Sluigilist_add_tail(struct list_head *o, struct list_head *head) 27204591Sluigi{ 28204735Sluigi __list_add(o, head->prev, head); 29204591Sluigi} 30204591Sluigi 31204591Sluigi#define list_first_entry(pL, ty, member) \ 32204591Sluigi (ty *)((char *)((pL)->next) - offsetof(ty, member)) 33204591Sluigi 34204591Sluigistatic inline void 35204591Sluigi__list_del(struct list_head *prev, struct list_head *next) 36204591Sluigi{ 37204591Sluigi next->prev = prev; 38204591Sluigi prev->next = next; 39204591Sluigi} 40204591Sluigi 41204591Sluigistatic inline void 42204591Sluigilist_del(struct list_head *entry) 43204591Sluigi{ 44204591Sluigi ND("called on %p", entry); 45204591Sluigi __list_del(entry->prev, entry->next); 46204591Sluigi entry->next = entry->prev = NULL; 47204591Sluigi} 48204591Sluigi 49204591Sluigi#endif /* _MYLIST_H */ 50