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