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