1204591Sluigi/* 2204591Sluigi * $FreeBSD$ 3204591Sluigi * 4204591Sluigi * linux-like bidirectional lists 5204591Sluigi */ 6204591Sluigi 7204591Sluigi#ifndef _MYLIST_H 8204591Sluigi#define _MYLIST_H 9294882Sluigi/* not just a head, also the link field for a list entry */ 10204591Sluigistruct list_head { 11204591Sluigi struct list_head *prev, *next; 12204591Sluigi}; 13204591Sluigi 14204591Sluigi#define INIT_LIST_HEAD(l) do { (l)->prev = (l)->next = (l); } while (0) 15204591Sluigi#define list_empty(l) ( (l)->next == l ) 16204591Sluigistatic inline void 17204735Sluigi__list_add(struct list_head *o, struct list_head *prev, 18204591Sluigi struct list_head *next) 19204591Sluigi{ 20204735Sluigi next->prev = o; 21204735Sluigi o->next = next; 22204735Sluigi o->prev = prev; 23204735Sluigi prev->next = o; 24204591Sluigi} 25204591Sluigi 26204591Sluigistatic inline void 27204735Sluigilist_add_tail(struct list_head *o, struct list_head *head) 28204591Sluigi{ 29204735Sluigi __list_add(o, head->prev, head); 30204591Sluigi} 31204591Sluigi 32204591Sluigi#define list_first_entry(pL, ty, member) \ 33204591Sluigi (ty *)((char *)((pL)->next) - offsetof(ty, member)) 34204591Sluigi 35204591Sluigistatic inline void 36204591Sluigi__list_del(struct list_head *prev, struct list_head *next) 37204591Sluigi{ 38204591Sluigi next->prev = prev; 39204591Sluigi prev->next = next; 40204591Sluigi} 41204591Sluigi 42204591Sluigistatic inline void 43204591Sluigilist_del(struct list_head *entry) 44204591Sluigi{ 45204591Sluigi ND("called on %p", entry); 46204591Sluigi __list_del(entry->prev, entry->next); 47204591Sluigi entry->next = entry->prev = NULL; 48204591Sluigi} 49204591Sluigi 50204591Sluigi#endif /* _MYLIST_H */ 51