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