murphyif: Free the connect timer when unloading
[profile/ivi/pulseaudio-module-murphy-ivi.git] / murphy / list.h
1 /*
2  * module-murphy-ivi -- PulseAudio module for providing audio routing support
3  * Copyright (c) 2012, Intel Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms and conditions of the GNU Lesser General Public License,
7  * version 2.1, as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.
12  * See the GNU Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this program; if not, write to the
16  * Free Software Foundation, Inc., 51 Franklin St - Fifth Floor, Boston,
17  * MA 02110-1301 USA.
18  *
19  */
20 #ifndef foomirlistfoo
21 #define foomirlistfoo
22
23 #define MIR_DIM(a)  (sizeof(a)/sizeof((a)[0]))
24
25 #define MIR_OFFSET(structure, member)                                   \
26     ((int)((void *)((&((structure *)0)->member)) - (void *)0))
27
28 #define MIR_LIST_RELOCATE(structure, member, ptr)                       \
29     ((structure *)((void *)ptr - MIR_OFFSET(structure, member)))
30
31
32 #define MIR_DLIST_HEAD(name)   mir_dlist name = { &(name), &(name) }
33
34 #define MIR_DLIST_INIT(self)                                            \
35     do {                                                                \
36         (&(self))->prev = &(self);                                      \
37         (&(self))->next = &(self);                                      \
38     } while(0)
39
40 #define MIR_DLIST_EMPTY(name)  ((&(name))->next == &(name))
41
42 #define MIR_DLIST_FOR_EACH(structure, member, pos, head)                \
43     for (pos = MIR_LIST_RELOCATE(structure, member, (head)->next);      \
44          &pos->member != (head);                                        \
45          pos = MIR_LIST_RELOCATE(structure, member, pos->member.next))
46
47 #define MIR_DLIST_FOR_EACH_SAFE(structure, member, pos, n, head)        \
48     for (pos = MIR_LIST_RELOCATE(structure, member, (head)->next),      \
49            n = MIR_LIST_RELOCATE(structure, member, pos->member.next);  \
50          &pos->member != (head);                                        \
51          pos = n,                                                       \
52            n = MIR_LIST_RELOCATE(structure, member, pos->member.next))
53
54 #define MIR_DLIST_FOR_EACH_BACKWARD(structure, member, pos, head)       \
55     for (pos = MIR_LIST_RELOCATE(structure, member, (head)->prev);      \
56          &pos->member != (head);                                        \
57          pos = MIR_LIST_RELOCATE(structure, member, pos->member.prev))
58
59 #define MIR_DLIST_FOR_EACH_NOHEAD(structure, member, pos, start)        \
60     for (pos = start;                                                   \
61          &(pos)->member != &(start)->member;                            \
62          pos = MIR_LIST_RELOCATE(structure, member, pos->member.next))
63
64 #define MIR_DLIST_FOR_EACH_NOHEAD_SAFE(structure, member, pos,n, start) \
65     for (pos = start,                                                   \
66            n = MIR_LIST_RELOCATE(structure, member, pos->member.next);  \
67          &pos->member != &(start)->member;                              \
68          pos = n,                                                       \
69            n = MIR_LIST_RELOCATE(structure, member, pos->member.next))
70
71 #define MIR_DLIST_INSERT_BEFORE(structure, member, new, before)         \
72     do {                                                                \
73         mir_dlist *after = (before)->prev;                              \
74         after->next = &(new)->member;                                   \
75         (new)->member.next = before;                                    \
76         (before)->prev = &(new)->member;                                \
77         (new)->member.prev = after;                                     \
78     } while(0)
79 #define MIR_DLIST_APPEND(structure, member, new, head)                  \
80     MIR_DLIST_INSERT_BEFORE(structure, member, new, head)
81
82 #define MIR_DLIST_INSERT_AFTER(structure, member, new, after)           \
83     do {                                                                \
84         mir_dlist *before = (after)->next;                              \
85         (after)->next = &((new)->member);                               \
86         (new)->member.next = before;                                    \
87         before->prev = &((new)->member);                                \
88         (new)->member.prev = after;                                     \
89     } while(0)
90 #define MIR_DLIST_PREPEND(structure, member, new, head)                 \
91     MIR_DLIST_INSERT_AFTER(structure, member, new, head)
92
93
94 #define MIR_DLIST_UNLINK(structure, member, elem)                       \
95     do {                                                                \
96         mir_dlist *after  = (elem)->member.prev;                        \
97         mir_dlist *before = (elem)->member.next;                        \
98         after->next = before;                                           \
99         before->prev = after;                                           \
100         (elem)->member.prev = (elem)->member.next = &(elem)->member;    \
101     } while(0)
102
103
104 typedef struct mir_dlist {
105     struct mir_dlist *prev;
106     struct mir_dlist *next;
107 } mir_dlist;
108
109 #endif /* foomirlistfoo */
110
111
112 /*
113  * Local Variables:
114  * c-basic-offset: 4
115  * indent-tabs-mode: nil
116  * End:
117  *
118  */