Add a module to compute various statistics
[lttv.git] / ltt / branches / poly / lttv / hook.c
CommitLineData
ffd54a90 1
3d218f2a 2#include <lttv/hook.h>
eccb5352 3
4
dc877563 5typedef struct _LttvHookClosure {
ffd54a90 6 LttvHook hook;
eccb5352 7 void *hook_data;
dc877563 8} LttvHookClosure;
eccb5352 9
10
dc877563 11LttvHooks *lttv_hooks_new()
12{
13 return g_array_new(FALSE, FALSE, sizeof(LttvHookClosure));
eccb5352 14}
15
dc877563 16
17void lttv_hooks_destroy(LttvHooks *h)
18{
eccb5352 19 g_array_free(h, TRUE);
20}
21
eccb5352 22
dc877563 23void lttv_hooks_add(LttvHooks *h, LttvHook f, void *hook_data)
24{
25 LttvHookClosure c;
26
27 if(h == NULL)g_error("Null hook added");
eccb5352 28
29 c.hook = f;
30 c.hook_data = hook_data;
31 g_array_append_val(h,c);
32}
33
34
dc877563 35void lttv_hooks_add_list(LttvHooks *h, LttvHooks *list)
36{
37 guint i;
38
ffd54a90 39 if(list == NULL) return;
dc877563 40 for(i = 0 ; i < list->len; i++) {
41 g_array_append_val(h,g_array_index(list, LttvHookClosure, i));
42 }
43}
44
45
46void *lttv_hooks_remove(LttvHooks *h, LttvHook f)
47{
48 unsigned i;
49
50 void *hook_data;
51
52 LttvHookClosure *c;
53
54 for(i = 0 ; i < h->len ; i++) {
55 c = &g_array_index(h, LttvHookClosure, i);
56 if(c->hook == f) {
57 hook_data = c->hook_data;
58 lttv_hooks_remove_by_position(h, i);
59 return hook_data;
60 }
61 }
62 return NULL;
63}
64
65
66void lttv_hooks_remove_data(LttvHooks *h, LttvHook f, void *hook_data)
eccb5352 67{
dc877563 68 unsigned i;
69
70 LttvHookClosure *c;
eccb5352 71
72 for(i = 0 ; i < h->len ; i++) {
dc877563 73 c = &g_array_index(h, LttvHookClosure, i);
74 if(c->hook == f && c->hook_data == hook_data) {
75 lttv_hooks_remove_by_position(h, i);
76 return;
77 }
78 }
79}
80
81
82void lttv_hooks_remove_list(LttvHooks *h, LttvHooks *list)
83{
84 guint i, j;
85
86 LttvHookClosure *c, *c_list;
87
ffd54a90 88 if(list == NULL) return;
dc877563 89 for(i = 0, j = 0 ; i < h->len && j < list->len ;) {
90 c = &g_array_index(h, LttvHookClosure, i);
91 c_list = &g_array_index(list, LttvHookClosure, j);
92 if(c->hook == c_list->hook && c->hook_data == c_list->hook_data) {
93 lttv_hooks_remove_by_position(h, i);
94 j++;
95 }
96 else i++;
97 }
98
99 /* Normally the hooks in h are ordered as in list. If this is not the case,
100 try harder here. */
101
102 if(j < list->len) {
103 for(; j < list->len ; j++) {
104 c_list = &g_array_index(list, LttvHookClosure, j);
105 lttv_hooks_remove_data(h, c_list->hook, c_list->hook_data);
106 }
eccb5352 107 }
108}
109
110
dc877563 111unsigned lttv_hooks_number(LttvHooks *h)
112{
113 return h->len;
114}
eccb5352 115
dc877563 116
117void lttv_hooks_get(LttvHooks *h, unsigned i, LttvHook *f, void **hook_data)
118{
119 LttvHookClosure *c;
120
121 c = &g_array_index(h, LttvHookClosure, i);
122 *f = c->hook;
123 *hook_data = c->hook_data;
124}
125
126
ffd54a90 127void lttv_hooks_remove_by_position(LttvHooks *h, unsigned i)
dc877563 128{
ffd54a90 129 g_array_remove_index(h, i);
dc877563 130}
131
132
133gboolean lttv_hooks_call(LttvHooks *h, void *call_data)
134{
b445142a 135 gboolean ret, sum_ret = FALSE;
dc877563 136
137 LttvHookClosure *c;
138
ffd54a90 139 guint i;
140
dc877563 141 if(h != NULL) {
142 for(i = 0 ; i < h->len ; i++) {
143 c = &g_array_index(h, LttvHookClosure, i);
b445142a 144 ret = c->hook(c->hook_data,call_data);
145 sum_ret = sum_ret || ret;
dc877563 146 }
147 }
b445142a 148 return sum_ret;
dc877563 149}
150
151
152gboolean lttv_hooks_call_check(LttvHooks *h, void *call_data)
153{
154 LttvHookClosure *c;
155
ffd54a90 156 guint i;
157
dc877563 158 for(i = 0 ; i < h->len ; i++) {
159 c = &g_array_index(h, LttvHookClosure, i);
160 if(c->hook(c->hook_data,call_data)) return TRUE;
161 }
162 return FALSE;
163}
164
165
166LttvHooksById *lttv_hooks_by_id_new()
167{
eccb5352 168 return g_ptr_array_new();
169}
170
171
dc877563 172void lttv_hooks_by_id_destroy(LttvHooksById *h)
173{
174 guint i;
175
176 for(i = 0 ; i < h->len ; i++) {
177 if(h->pdata[i] != NULL) lttv_hooks_destroy((LttvHooks *)(h->pdata[i]));
178 }
eccb5352 179 g_ptr_array_free(h, TRUE);
180}
181
182
ffd54a90 183LttvHooks *lttv_hooks_by_id_find(LttvHooksById *h, unsigned id)
eccb5352 184{
dc877563 185 if(h->len <= id) g_ptr_array_set_size(h, id + 1);
eccb5352 186 if(h->pdata[id] == NULL) h->pdata[id] = lttv_hooks_new();
dc877563 187 return h->pdata[id];
eccb5352 188}
189
dc877563 190
191unsigned lttv_hooks_by_id_max_id(LttvHooksById *h)
eccb5352 192{
dc877563 193 return h->len;
194}
195
196
197LttvHooks *lttv_hooks_by_id_get(LttvHooksById *h, unsigned id)
198{
199 if(id < h->len) return h->pdata[id];
200 return NULL;
201}
202
203
204void lttv_hooks_by_id_remove(LttvHooksById *h, unsigned id)
205{
206 if(id < h->len && h->pdata[id] != NULL) {
207 lttv_hooks_destroy((LttvHooks *)h->pdata[id]);
208 h->pdata[id] = NULL;
209 }
eccb5352 210}
211
This page took 0.03239 seconds and 4 git commands to generate.