Commit | Line | Data |
---|---|---|
fb2dcc52 | 1 | /* |
3310b217 | 2 | * Copyright 2016 Jérémie Galarneau <jeremie.galarneau@efficios.com> |
fb2dcc52 JG |
3 | * |
4 | * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com> | |
5 | * | |
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy | |
7 | * of this software and associated documentation files (the "Software"), to deal | |
8 | * in the Software without restriction, including without limitation the rights | |
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
10 | * copies of the Software, and to permit persons to whom the Software is | |
11 | * furnished to do so, subject to the following conditions: | |
12 | * | |
13 | * The above copyright notice and this permission notice shall be included in | |
14 | * all copies or substantial portions of the Software. | |
15 | * | |
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
22 | * SOFTWARE. | |
23 | */ | |
24 | ||
a3aacb6f PP |
25 | #define BT_LOG_TAG "COMP-CLASS" |
26 | #include <babeltrace/lib-logging-internal.h> | |
27 | ||
3d9990ac | 28 | #include <babeltrace/compiler-internal.h> |
d94d92ac PP |
29 | #include <babeltrace/graph/private-component-class.h> |
30 | #include <babeltrace/graph/private-component-class-source.h> | |
31 | #include <babeltrace/graph/private-component-class-filter.h> | |
32 | #include <babeltrace/graph/private-component-class-sink.h> | |
b2e0c907 | 33 | #include <babeltrace/graph/component-class-internal.h> |
65300d60 | 34 | #include <babeltrace/object.h> |
c55a9f58 | 35 | #include <babeltrace/types.h> |
f6ccaed9 | 36 | #include <babeltrace/assert-internal.h> |
d94d92ac | 37 | #include <babeltrace/assert-pre-internal.h> |
fb2dcc52 JG |
38 | #include <glib.h> |
39 | ||
d94d92ac PP |
40 | #define BT_ASSERT_PRE_COMP_CLS_HOT(_cc) \ |
41 | BT_ASSERT_PRE_HOT(((struct bt_component_class *) (_cc)), \ | |
42 | "Component class", ": %!+C", (_cc)) | |
43 | ||
fb2dcc52 | 44 | static |
d94d92ac | 45 | void destroy_component_class(struct bt_object *obj) |
fb2dcc52 JG |
46 | { |
47 | struct bt_component_class *class; | |
33b34c43 | 48 | int i; |
fb2dcc52 | 49 | |
f6ccaed9 | 50 | BT_ASSERT(obj); |
b8a06801 | 51 | class = container_of(obj, struct bt_component_class, base); |
33b34c43 | 52 | |
d94d92ac | 53 | BT_LIB_LOGD("Destroying component class: %!+C", class); |
a3aacb6f | 54 | |
33b34c43 PP |
55 | /* Call destroy listeners in reverse registration order */ |
56 | for (i = class->destroy_listeners->len - 1; i >= 0; i--) { | |
d3e4dcd8 | 57 | struct bt_component_class_destroy_listener *listener = |
33b34c43 | 58 | &g_array_index(class->destroy_listeners, |
d3e4dcd8 | 59 | struct bt_component_class_destroy_listener, |
33b34c43 PP |
60 | i); |
61 | ||
a3aacb6f PP |
62 | BT_LOGD("Calling destroy listener: func-addr=%p, data-addr=%p", |
63 | listener->func, listener->data); | |
33b34c43 PP |
64 | listener->func(class, listener->data); |
65 | } | |
66 | ||
fb2dcc52 JG |
67 | if (class->name) { |
68 | g_string_free(class->name, TRUE); | |
d94d92ac | 69 | class->name = NULL; |
fb2dcc52 | 70 | } |
d94d92ac | 71 | |
7c7c0433 JG |
72 | if (class->description) { |
73 | g_string_free(class->description, TRUE); | |
d94d92ac | 74 | class->description = NULL; |
7c7c0433 | 75 | } |
d94d92ac | 76 | |
5536d9a6 PP |
77 | if (class->help) { |
78 | g_string_free(class->help, TRUE); | |
d94d92ac | 79 | class->help = NULL; |
5536d9a6 | 80 | } |
d94d92ac | 81 | |
33b34c43 PP |
82 | if (class->destroy_listeners) { |
83 | g_array_free(class->destroy_listeners, TRUE); | |
d94d92ac | 84 | class->destroy_listeners = NULL; |
33b34c43 | 85 | } |
b8a06801 | 86 | |
fb2dcc52 JG |
87 | g_free(class); |
88 | } | |
89 | ||
d3e4dcd8 PP |
90 | static |
91 | int bt_component_class_init(struct bt_component_class *class, | |
92 | enum bt_component_class_type type, const char *name) | |
fb2dcc52 | 93 | { |
d3e4dcd8 PP |
94 | int ret = 0; |
95 | ||
d94d92ac | 96 | bt_object_init_shared(&class->base, destroy_component_class); |
d3e4dcd8 PP |
97 | class->type = type; |
98 | class->name = g_string_new(name); | |
99 | if (!class->name) { | |
a3aacb6f | 100 | BT_LOGE_STR("Failed to allocate a GString."); |
d3e4dcd8 PP |
101 | goto error; |
102 | } | |
103 | ||
104 | class->description = g_string_new(NULL); | |
105 | if (!class->description) { | |
a3aacb6f | 106 | BT_LOGE_STR("Failed to allocate a GString."); |
d3e4dcd8 PP |
107 | goto error; |
108 | } | |
109 | ||
5536d9a6 PP |
110 | class->help = g_string_new(NULL); |
111 | if (!class->help) { | |
a3aacb6f | 112 | BT_LOGE_STR("Failed to allocate a GString."); |
5536d9a6 PP |
113 | goto error; |
114 | } | |
115 | ||
d3e4dcd8 PP |
116 | class->destroy_listeners = g_array_new(FALSE, TRUE, |
117 | sizeof(struct bt_component_class_destroy_listener)); | |
118 | if (!class->destroy_listeners) { | |
a3aacb6f | 119 | BT_LOGE_STR("Failed to allocate a GArray."); |
d3e4dcd8 PP |
120 | goto error; |
121 | } | |
122 | ||
123 | goto end; | |
6ba0b073 | 124 | |
d3e4dcd8 | 125 | error: |
65300d60 | 126 | BT_OBJECT_PUT_REF_AND_RESET(class); |
d3e4dcd8 PP |
127 | ret = -1; |
128 | ||
129 | end: | |
130 | return ret; | |
131 | } | |
132 | ||
d94d92ac PP |
133 | struct bt_private_component_class_source * |
134 | bt_private_component_class_source_create( | |
135 | const char *name, | |
136 | bt_private_component_class_source_notification_iterator_next_method method) | |
d3e4dcd8 PP |
137 | { |
138 | struct bt_component_class_source *source_class = NULL; | |
139 | int ret; | |
140 | ||
d94d92ac PP |
141 | BT_ASSERT_PRE_NON_NULL(name, "Name"); |
142 | BT_ASSERT_PRE_NON_NULL(method, "Notification iterator next method"); | |
a3aacb6f PP |
143 | BT_LOGD("Creating source component class: " |
144 | "name=\"%s\", notif-iter-next-method-addr=%p", | |
90157d89 | 145 | name, method); |
d3e4dcd8 PP |
146 | source_class = g_new0(struct bt_component_class_source, 1); |
147 | if (!source_class) { | |
a3aacb6f | 148 | BT_LOGE_STR("Failed to allocate one source component class."); |
fb2dcc52 JG |
149 | goto end; |
150 | } | |
151 | ||
a3aacb6f | 152 | /* bt_component_class_init() logs errors */ |
d3e4dcd8 PP |
153 | ret = bt_component_class_init(&source_class->parent, |
154 | BT_COMPONENT_CLASS_TYPE_SOURCE, name); | |
155 | if (ret) { | |
156 | /* | |
157 | * If bt_component_class_init() fails, the component | |
158 | * class is put, therefore its memory is already | |
159 | * freed. | |
160 | */ | |
161 | source_class = NULL; | |
162 | goto end; | |
163 | } | |
164 | ||
d94d92ac PP |
165 | source_class->methods.notif_iter_next = method; |
166 | BT_LIB_LOGD("Created source component class: %!+C", source_class); | |
d3e4dcd8 PP |
167 | |
168 | end: | |
d94d92ac | 169 | return (void *) source_class; |
d3e4dcd8 PP |
170 | } |
171 | ||
d94d92ac PP |
172 | struct bt_private_component_class_filter * |
173 | bt_private_component_class_filter_create(const char *name, | |
174 | bt_private_component_class_filter_notification_iterator_next_method method) | |
d3e4dcd8 PP |
175 | { |
176 | struct bt_component_class_filter *filter_class = NULL; | |
177 | int ret; | |
178 | ||
d94d92ac PP |
179 | BT_ASSERT_PRE_NON_NULL(name, "Name"); |
180 | BT_ASSERT_PRE_NON_NULL(method, "Notification iterator next method"); | |
a3aacb6f PP |
181 | BT_LOGD("Creating filter component class: " |
182 | "name=\"%s\", notif-iter-next-method-addr=%p", | |
90157d89 | 183 | name, method); |
d3e4dcd8 PP |
184 | filter_class = g_new0(struct bt_component_class_filter, 1); |
185 | if (!filter_class) { | |
a3aacb6f | 186 | BT_LOGE_STR("Failed to allocate one filter component class."); |
d3e4dcd8 | 187 | goto end; |
6ba0b073 PP |
188 | } |
189 | ||
a3aacb6f | 190 | /* bt_component_class_init() logs errors */ |
d3e4dcd8 PP |
191 | ret = bt_component_class_init(&filter_class->parent, |
192 | BT_COMPONENT_CLASS_TYPE_FILTER, name); | |
193 | if (ret) { | |
194 | /* | |
195 | * If bt_component_class_init() fails, the component | |
196 | * class is put, therefore its memory is already | |
197 | * freed. | |
198 | */ | |
199 | filter_class = NULL; | |
33b34c43 PP |
200 | goto end; |
201 | } | |
d3e4dcd8 | 202 | |
d94d92ac PP |
203 | filter_class->methods.notif_iter_next = method; |
204 | BT_LIB_LOGD("Created filter component class: %!+C", filter_class); | |
d3e4dcd8 | 205 | |
fb2dcc52 | 206 | end: |
d94d92ac | 207 | return (void *) filter_class; |
d3e4dcd8 PP |
208 | } |
209 | ||
d94d92ac PP |
210 | struct bt_private_component_class_sink *bt_private_component_class_sink_create( |
211 | const char *name, | |
212 | bt_private_component_class_sink_consume_method method) | |
d3e4dcd8 PP |
213 | { |
214 | struct bt_component_class_sink *sink_class = NULL; | |
215 | int ret; | |
216 | ||
d94d92ac PP |
217 | BT_ASSERT_PRE_NON_NULL(name, "Name"); |
218 | BT_ASSERT_PRE_NON_NULL(method, "Consume next method"); | |
a3aacb6f PP |
219 | BT_LOGD("Creating sink component class: " |
220 | "name=\"%s\", consume-method-addr=%p", | |
90157d89 | 221 | name, method); |
d3e4dcd8 PP |
222 | sink_class = g_new0(struct bt_component_class_sink, 1); |
223 | if (!sink_class) { | |
a3aacb6f | 224 | BT_LOGE_STR("Failed to allocate one sink component class."); |
d3e4dcd8 PP |
225 | goto end; |
226 | } | |
227 | ||
a3aacb6f | 228 | /* bt_component_class_init() logs errors */ |
d3e4dcd8 PP |
229 | ret = bt_component_class_init(&sink_class->parent, |
230 | BT_COMPONENT_CLASS_TYPE_SINK, name); | |
231 | if (ret) { | |
232 | /* | |
233 | * If bt_component_class_init() fails, the component | |
234 | * class is put, therefore its memory is already | |
235 | * freed. | |
236 | */ | |
237 | sink_class = NULL; | |
238 | goto end; | |
239 | } | |
240 | ||
90157d89 | 241 | sink_class->methods.consume = method; |
d94d92ac | 242 | BT_LIB_LOGD("Created sink component class: %!+C", sink_class); |
d3e4dcd8 PP |
243 | |
244 | end: | |
d94d92ac | 245 | return (void *) sink_class; |
d3e4dcd8 PP |
246 | } |
247 | ||
d94d92ac PP |
248 | int bt_private_component_class_source_set_init_method( |
249 | struct bt_private_component_class_source *priv_comp_cls, | |
250 | bt_private_component_class_source_init_method method) | |
d3e4dcd8 | 251 | { |
d94d92ac PP |
252 | struct bt_component_class_source *comp_cls = (void *) priv_comp_cls; |
253 | ||
254 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
255 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
256 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
257 | comp_cls->methods.init = method; | |
258 | BT_LIB_LOGV("Set source component class's initialization method: " | |
259 | "%!+C", comp_cls); | |
260 | return 0; | |
d3e4dcd8 PP |
261 | } |
262 | ||
d94d92ac PP |
263 | int bt_private_component_class_filter_set_init_method( |
264 | struct bt_private_component_class_filter *priv_comp_cls, | |
265 | bt_private_component_class_filter_init_method method) | |
efa96d5d | 266 | { |
d94d92ac PP |
267 | struct bt_component_class_filter *comp_cls = (void *) priv_comp_cls; |
268 | ||
269 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
270 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
271 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
272 | comp_cls->methods.init = method; | |
273 | BT_LIB_LOGV("Set filter component class's initialization method: " | |
274 | "%!+C", comp_cls); | |
275 | return 0; | |
efa96d5d PP |
276 | } |
277 | ||
d94d92ac PP |
278 | int bt_private_component_class_sink_set_init_method( |
279 | struct bt_private_component_class_sink *priv_comp_cls, | |
280 | bt_private_component_class_sink_init_method method) | |
2d41b99e | 281 | { |
d94d92ac PP |
282 | struct bt_component_class_sink *comp_cls = (void *) priv_comp_cls; |
283 | ||
284 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
285 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
286 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
287 | comp_cls->methods.init = method; | |
288 | BT_LIB_LOGV("Set sink component class's initialization method: " | |
289 | "%!+C", comp_cls); | |
290 | return 0; | |
72b913fb PP |
291 | } |
292 | ||
d94d92ac PP |
293 | int bt_private_component_class_source_set_finalize_method( |
294 | struct bt_private_component_class_source *priv_comp_cls, | |
295 | bt_private_component_class_source_finalize_method method) | |
0d8b4d8e | 296 | { |
d94d92ac PP |
297 | struct bt_component_class_source *comp_cls = (void *) priv_comp_cls; |
298 | ||
299 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
300 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
301 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
302 | comp_cls->methods.finalize = method; | |
303 | BT_LIB_LOGV("Set source component class's finalization method: " | |
304 | "%!+C", comp_cls); | |
305 | return 0; | |
0d8b4d8e PP |
306 | } |
307 | ||
d94d92ac PP |
308 | int bt_private_component_class_filter_set_finalize_method( |
309 | struct bt_private_component_class_filter *priv_comp_cls, | |
310 | bt_private_component_class_filter_finalize_method method) | |
72b913fb | 311 | { |
d94d92ac PP |
312 | struct bt_component_class_filter *comp_cls = (void *) priv_comp_cls; |
313 | ||
314 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
315 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
316 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
317 | comp_cls->methods.finalize = method; | |
318 | BT_LIB_LOGV("Set filter component class's finalization method: " | |
319 | "%!+C", comp_cls); | |
320 | return 0; | |
2d41b99e JG |
321 | } |
322 | ||
d94d92ac PP |
323 | int bt_private_component_class_sink_set_finalize_method( |
324 | struct bt_private_component_class_sink *priv_comp_cls, | |
325 | bt_private_component_class_sink_finalize_method method) | |
d3e4dcd8 | 326 | { |
d94d92ac PP |
327 | struct bt_component_class_sink *comp_cls = (void *) priv_comp_cls; |
328 | ||
329 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
330 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
331 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
332 | comp_cls->methods.finalize = method; | |
333 | BT_LIB_LOGV("Set sink component class's finalization method: " | |
334 | "%!+C", comp_cls); | |
335 | return 0; | |
d3e4dcd8 PP |
336 | } |
337 | ||
d94d92ac PP |
338 | int bt_private_component_class_source_set_query_method( |
339 | struct bt_private_component_class_source *priv_comp_cls, | |
340 | bt_private_component_class_source_query_method method) | |
d3eb6e8f | 341 | { |
d94d92ac PP |
342 | struct bt_component_class_source *comp_cls = (void *) priv_comp_cls; |
343 | ||
344 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
345 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
346 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
347 | comp_cls->methods.query = method; | |
348 | BT_LIB_LOGV("Set source component class's query method: " | |
349 | "%!+C", comp_cls); | |
350 | return 0; | |
d3eb6e8f PP |
351 | } |
352 | ||
d94d92ac PP |
353 | int bt_private_component_class_filter_set_query_method( |
354 | struct bt_private_component_class_filter *priv_comp_cls, | |
355 | bt_private_component_class_filter_query_method method) | |
d3eb6e8f | 356 | { |
d94d92ac PP |
357 | struct bt_component_class_filter *comp_cls = (void *) priv_comp_cls; |
358 | ||
359 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
360 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
361 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
362 | comp_cls->methods.query = method; | |
363 | BT_LIB_LOGV("Set filter component class's query method: " | |
364 | "%!+C", comp_cls); | |
365 | return 0; | |
366 | } | |
a3aacb6f | 367 | |
d94d92ac PP |
368 | int bt_private_component_class_sink_set_query_method( |
369 | struct bt_private_component_class_sink *priv_comp_cls, | |
370 | bt_private_component_class_sink_query_method method) | |
371 | { | |
372 | struct bt_component_class_sink *comp_cls = (void *) priv_comp_cls; | |
373 | ||
374 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
375 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
376 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
377 | comp_cls->methods.query = method; | |
378 | BT_LIB_LOGV("Set sink component class's query method: " | |
379 | "%!+C", comp_cls); | |
380 | return 0; | |
381 | } | |
d3eb6e8f | 382 | |
d94d92ac PP |
383 | int bt_private_component_class_filter_set_accept_input_port_connection_method( |
384 | struct bt_private_component_class_filter *priv_comp_cls, | |
385 | bt_private_component_class_filter_accept_input_port_connection_method method) | |
386 | { | |
387 | struct bt_component_class_filter *comp_cls = (void *) priv_comp_cls; | |
388 | ||
389 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
390 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
391 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
392 | comp_cls->methods.accept_input_port_connection = method; | |
393 | BT_LIB_LOGV("Set filter component class's \"accept input port connection\" method" | |
394 | ": %!+C", comp_cls); | |
395 | return 0; | |
396 | } | |
d3eb6e8f | 397 | |
d94d92ac PP |
398 | int bt_private_component_class_sink_set_accept_input_port_connection_method( |
399 | struct bt_private_component_class_sink *priv_comp_cls, | |
400 | bt_private_component_class_sink_accept_input_port_connection_method method) | |
401 | { | |
402 | struct bt_component_class_sink *comp_cls = (void *) priv_comp_cls; | |
403 | ||
404 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
405 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
406 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
407 | comp_cls->methods.accept_input_port_connection = method; | |
408 | BT_LIB_LOGV("Set sink component class's \"accept input port connection\" method" | |
409 | ": %!+C", comp_cls); | |
410 | return 0; | |
d3eb6e8f PP |
411 | } |
412 | ||
d94d92ac PP |
413 | int bt_private_component_class_source_set_accept_output_port_connection_method( |
414 | struct bt_private_component_class_source *priv_comp_cls, | |
415 | bt_private_component_class_source_accept_output_port_connection_method method) | |
d3eb6e8f | 416 | { |
d94d92ac PP |
417 | struct bt_component_class_source *comp_cls = (void *) priv_comp_cls; |
418 | ||
419 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
420 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
421 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
422 | comp_cls->methods.accept_output_port_connection = method; | |
423 | BT_LIB_LOGV("Set source component class's \"accept output port connection\" method" | |
424 | ": %!+C", comp_cls); | |
425 | return 0; | |
426 | } | |
d3eb6e8f | 427 | |
d94d92ac PP |
428 | int bt_private_component_class_filter_set_accept_output_port_connection_method( |
429 | struct bt_private_component_class_filter *priv_comp_cls, | |
430 | bt_private_component_class_filter_accept_output_port_connection_method method) | |
431 | { | |
432 | struct bt_component_class_filter *comp_cls = (void *) priv_comp_cls; | |
433 | ||
434 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
435 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
436 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
437 | comp_cls->methods.accept_output_port_connection = method; | |
438 | BT_LIB_LOGV("Set filter component class's \"accept output port connection\" method" | |
439 | ": %!+C", comp_cls); | |
440 | return 0; | |
441 | } | |
a3aacb6f | 442 | |
d94d92ac PP |
443 | int bt_private_component_class_filter_set_input_port_connected_method( |
444 | struct bt_private_component_class_filter *priv_comp_cls, | |
445 | bt_private_component_class_filter_input_port_connected_method method) | |
446 | { | |
447 | struct bt_component_class_filter *comp_cls = (void *) priv_comp_cls; | |
448 | ||
449 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
450 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
451 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
452 | comp_cls->methods.input_port_connected = method; | |
453 | BT_LIB_LOGV("Set filter component class's \"input port connected\" method" | |
454 | ": %!+C", comp_cls); | |
455 | return 0; | |
456 | } | |
a3aacb6f | 457 | |
d94d92ac PP |
458 | int bt_private_component_class_sink_set_input_port_connected_method( |
459 | struct bt_private_component_class_sink *priv_comp_cls, | |
460 | bt_private_component_class_sink_input_port_connected_method method) | |
461 | { | |
462 | struct bt_component_class_sink *comp_cls = (void *) priv_comp_cls; | |
463 | ||
464 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
465 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
466 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
467 | comp_cls->methods.input_port_connected = method; | |
468 | BT_LIB_LOGV("Set sink component class's \"input port connected\" method" | |
469 | ": %!+C", comp_cls); | |
470 | return 0; | |
471 | } | |
a3aacb6f | 472 | |
d94d92ac PP |
473 | int bt_private_component_class_source_set_output_port_connected_method( |
474 | struct bt_private_component_class_source *priv_comp_cls, | |
475 | bt_private_component_class_source_output_port_connected_method method) | |
476 | { | |
477 | struct bt_component_class_source *comp_cls = (void *) priv_comp_cls; | |
478 | ||
479 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
480 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
481 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
482 | comp_cls->methods.output_port_connected = method; | |
483 | BT_LIB_LOGV("Set source component class's \"output port connected\" method" | |
484 | ": %!+C", comp_cls); | |
485 | return 0; | |
486 | } | |
d3eb6e8f | 487 | |
d94d92ac PP |
488 | int bt_private_component_class_filter_set_output_port_connected_method( |
489 | struct bt_private_component_class_filter *priv_comp_cls, | |
490 | bt_private_component_class_filter_output_port_connected_method method) | |
491 | { | |
492 | struct bt_component_class_filter *comp_cls = (void *) priv_comp_cls; | |
493 | ||
494 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
495 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
496 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
497 | comp_cls->methods.output_port_connected = method; | |
498 | BT_LIB_LOGV("Set filter component class's \"output port connected\" method" | |
499 | ": %!+C", comp_cls); | |
500 | return 0; | |
501 | } | |
d3eb6e8f | 502 | |
d94d92ac PP |
503 | int bt_private_component_class_filter_set_input_port_disconnected_method( |
504 | struct bt_private_component_class_filter *priv_comp_cls, | |
505 | bt_private_component_class_filter_input_port_disconnected_method method) | |
506 | { | |
507 | struct bt_component_class_filter *comp_cls = (void *) priv_comp_cls; | |
508 | ||
509 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
510 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
511 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
512 | comp_cls->methods.input_port_disconnected = method; | |
513 | BT_LIB_LOGV("Set filter component class's \"input port disconnected\" method" | |
514 | ": %!+C", comp_cls); | |
515 | return 0; | |
d3eb6e8f PP |
516 | } |
517 | ||
d94d92ac PP |
518 | int bt_private_component_class_sink_set_input_port_disconnected_method( |
519 | struct bt_private_component_class_sink *priv_comp_cls, | |
520 | bt_private_component_class_sink_input_port_disconnected_method method) | |
d3eb6e8f | 521 | { |
d94d92ac PP |
522 | struct bt_component_class_sink *comp_cls = (void *) priv_comp_cls; |
523 | ||
524 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
525 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
526 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
527 | comp_cls->methods.input_port_disconnected = method; | |
528 | BT_LIB_LOGV("Set sink component class's \"input port disconnected\" method" | |
529 | ": %!+C", comp_cls); | |
530 | return 0; | |
531 | } | |
d3eb6e8f | 532 | |
d94d92ac PP |
533 | int bt_private_component_class_source_set_output_port_disconnected_method( |
534 | struct bt_private_component_class_source *priv_comp_cls, | |
535 | bt_private_component_class_source_output_port_disconnected_method method) | |
536 | { | |
537 | struct bt_component_class_source *comp_cls = (void *) priv_comp_cls; | |
538 | ||
539 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
540 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
541 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
542 | comp_cls->methods.output_port_disconnected = method; | |
543 | BT_LIB_LOGV("Set source component class's \"output port disconnected\" method" | |
544 | ": %!+C", comp_cls); | |
545 | return 0; | |
546 | } | |
a3aacb6f | 547 | |
d94d92ac PP |
548 | int bt_private_component_class_filter_set_output_port_disconnected_method( |
549 | struct bt_private_component_class_filter *priv_comp_cls, | |
550 | bt_private_component_class_filter_output_port_disconnected_method method) | |
551 | { | |
552 | struct bt_component_class_filter *comp_cls = (void *) priv_comp_cls; | |
553 | ||
554 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
555 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
556 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
557 | comp_cls->methods.output_port_disconnected = method; | |
558 | BT_LIB_LOGV("Set filter component class's \"output port disconnected\" method" | |
559 | ": %!+C", comp_cls); | |
560 | return 0; | |
561 | } | |
a3aacb6f | 562 | |
d94d92ac PP |
563 | int bt_private_component_class_source_set_notification_iterator_init_method( |
564 | struct bt_private_component_class_source *priv_comp_cls, | |
565 | bt_private_component_class_source_notification_iterator_init_method method) | |
566 | { | |
567 | struct bt_component_class_source *comp_cls = (void *) priv_comp_cls; | |
568 | ||
569 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
570 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
571 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
572 | comp_cls->methods.notif_iter_init = method; | |
573 | BT_LIB_LOGV("Set source component class's notification iterator initialization method" | |
574 | ": %!+C", comp_cls); | |
575 | return 0; | |
576 | } | |
a3aacb6f | 577 | |
d94d92ac PP |
578 | int bt_private_component_class_filter_set_notification_iterator_init_method( |
579 | struct bt_private_component_class_filter *priv_comp_cls, | |
580 | bt_private_component_class_filter_notification_iterator_init_method method) | |
581 | { | |
582 | struct bt_component_class_filter *comp_cls = (void *) priv_comp_cls; | |
583 | ||
584 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
585 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
586 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
587 | comp_cls->methods.notif_iter_init = method; | |
588 | BT_LIB_LOGV("Set filter component class's notification iterator initialization method" | |
589 | ": %!+C", comp_cls); | |
590 | return 0; | |
591 | } | |
d3eb6e8f | 592 | |
d94d92ac PP |
593 | int bt_private_component_class_source_set_notification_iterator_finalize_method( |
594 | struct bt_private_component_class_source *priv_comp_cls, | |
595 | bt_private_component_class_source_notification_iterator_finalize_method method) | |
596 | { | |
597 | struct bt_component_class_source *comp_cls = (void *) priv_comp_cls; | |
598 | ||
599 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
600 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
601 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
602 | comp_cls->methods.notif_iter_finalize = method; | |
603 | BT_LIB_LOGV("Set source component class's notification iterator finalization method" | |
604 | ": %!+C", comp_cls); | |
605 | return 0; | |
606 | } | |
d3eb6e8f | 607 | |
d94d92ac PP |
608 | int bt_private_component_class_filter_set_notification_iterator_finalize_method( |
609 | struct bt_private_component_class_filter *priv_comp_cls, | |
610 | bt_private_component_class_filter_notification_iterator_finalize_method method) | |
611 | { | |
612 | struct bt_component_class_filter *comp_cls = (void *) priv_comp_cls; | |
613 | ||
614 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
615 | BT_ASSERT_PRE_NON_NULL(method, "Method"); | |
616 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
617 | comp_cls->methods.notif_iter_finalize = method; | |
618 | BT_LIB_LOGV("Set filter component class's notification iterator finalization method" | |
619 | ": %!+C", comp_cls); | |
620 | return 0; | |
d3eb6e8f PP |
621 | } |
622 | ||
d94d92ac PP |
623 | int bt_private_component_class_set_description( |
624 | struct bt_private_component_class *priv_comp_cls, | |
d3e4dcd8 PP |
625 | const char *description) |
626 | { | |
d94d92ac | 627 | struct bt_component_class *comp_cls = (void *) priv_comp_cls; |
a3aacb6f | 628 | |
d94d92ac PP |
629 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); |
630 | BT_ASSERT_PRE_NON_NULL(description, "Description"); | |
631 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
632 | g_string_assign(comp_cls->description, description); | |
633 | BT_LIB_LOGV("Set component class's description: " | |
a3aacb6f | 634 | "addr=%p, name=\"%s\", type=%s", |
d94d92ac PP |
635 | comp_cls, |
636 | bt_component_class_get_name(comp_cls), | |
637 | bt_component_class_type_string(comp_cls->type)); | |
638 | return 0; | |
fb2dcc52 | 639 | } |
38b48196 | 640 | |
d94d92ac PP |
641 | int bt_private_component_class_set_help( |
642 | struct bt_private_component_class *priv_comp_cls, | |
5536d9a6 PP |
643 | const char *help) |
644 | { | |
d94d92ac PP |
645 | struct bt_component_class *comp_cls = (void *) priv_comp_cls; |
646 | ||
647 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); | |
648 | BT_ASSERT_PRE_NON_NULL(help, "Help"); | |
649 | BT_ASSERT_PRE_COMP_CLS_HOT(comp_cls); | |
650 | g_string_assign(comp_cls->help, help); | |
651 | BT_LIB_LOGV("Set component class's help text: %!+C", comp_cls); | |
652 | return 0; | |
5536d9a6 PP |
653 | } |
654 | ||
d94d92ac | 655 | const char *bt_component_class_get_name(struct bt_component_class *comp_cls) |
38b48196 | 656 | { |
d94d92ac PP |
657 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); |
658 | return comp_cls->name->str; | |
38b48196 JG |
659 | } |
660 | ||
d3e4dcd8 | 661 | enum bt_component_class_type bt_component_class_get_type( |
d94d92ac | 662 | struct bt_component_class *comp_cls) |
38b48196 | 663 | { |
d94d92ac PP |
664 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); |
665 | return comp_cls->type; | |
38b48196 JG |
666 | } |
667 | ||
33b34c43 | 668 | const char *bt_component_class_get_description( |
d94d92ac | 669 | struct bt_component_class *comp_cls) |
38b48196 | 670 | { |
d94d92ac PP |
671 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); |
672 | return comp_cls->description && | |
673 | comp_cls->description->str[0] != '\0' ? | |
674 | comp_cls->description->str : NULL; | |
38b48196 | 675 | } |
7c7c0433 | 676 | |
5536d9a6 | 677 | const char *bt_component_class_get_help( |
d94d92ac | 678 | struct bt_component_class *comp_cls) |
5536d9a6 | 679 | { |
d94d92ac PP |
680 | BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); |
681 | return comp_cls->help && | |
682 | comp_cls->help->str[0] != '\0' ? comp_cls->help->str : NULL; | |
5536d9a6 PP |
683 | } |
684 | ||
33b34c43 | 685 | BT_HIDDEN |
d94d92ac PP |
686 | void bt_component_class_add_destroy_listener( |
687 | struct bt_component_class *comp_cls, | |
33b34c43 | 688 | bt_component_class_destroy_listener_func func, void *data) |
7c7c0433 | 689 | { |
d3e4dcd8 | 690 | struct bt_component_class_destroy_listener listener; |
33b34c43 | 691 | |
d94d92ac | 692 | BT_ASSERT(comp_cls); |
f6ccaed9 | 693 | BT_ASSERT(func); |
33b34c43 PP |
694 | listener.func = func; |
695 | listener.data = data; | |
d94d92ac PP |
696 | g_array_append_val(comp_cls->destroy_listeners, listener); |
697 | BT_LIB_LOGV("Added destroy listener to component class: " | |
698 | "%![cc-]+C, listener-func-addr=%p", comp_cls, func); | |
7c7c0433 | 699 | } |
d3e4dcd8 | 700 | |
d94d92ac PP |
701 | BT_HIDDEN |
702 | void _bt_component_class_freeze(struct bt_component_class *comp_cls) | |
1e4d8103 | 703 | { |
d94d92ac PP |
704 | BT_ASSERT(comp_cls); |
705 | BT_LIB_LOGD("Freezing component class: %!+C", comp_cls); | |
706 | comp_cls->frozen = true; | |
1e4d8103 | 707 | } |