2 * Copyright 2016 Jérémie Galarneau <jeremie.galarneau@efficios.com>
4 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
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:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
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
25 #define BT_LOG_TAG "COMP-CLASS"
26 #include <babeltrace/lib-logging-internal.h>
28 #include <babeltrace/compiler-internal.h>
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>
33 #include <babeltrace/graph/component-class-internal.h>
34 #include <babeltrace/object.h>
35 #include <babeltrace/types.h>
36 #include <babeltrace/assert-internal.h>
37 #include <babeltrace/assert-pre-internal.h>
40 #define BT_ASSERT_PRE_COMP_CLS_HOT(_cc) \
41 BT_ASSERT_PRE_HOT(((struct bt_component_class *) (_cc)), \
42 "Component class", ": %!+C", (_cc))
45 void destroy_component_class(struct bt_object
*obj
)
47 struct bt_component_class
*class;
51 class = container_of(obj
, struct bt_component_class
, base
);
53 BT_LIB_LOGD("Destroying component class: %!+C", class);
55 /* Call destroy listeners in reverse registration order */
56 for (i
= class->destroy_listeners
->len
- 1; i
>= 0; i
--) {
57 struct bt_component_class_destroy_listener
*listener
=
58 &g_array_index(class->destroy_listeners
,
59 struct bt_component_class_destroy_listener
,
62 BT_LOGD("Calling destroy listener: func-addr=%p, data-addr=%p",
63 listener
->func
, listener
->data
);
64 listener
->func(class, listener
->data
);
68 g_string_free(class->name
, TRUE
);
72 if (class->description
) {
73 g_string_free(class->description
, TRUE
);
74 class->description
= NULL
;
78 g_string_free(class->help
, TRUE
);
82 if (class->destroy_listeners
) {
83 g_array_free(class->destroy_listeners
, TRUE
);
84 class->destroy_listeners
= NULL
;
91 int bt_component_class_init(struct bt_component_class
*class,
92 enum bt_component_class_type type
, const char *name
)
96 bt_object_init_shared(&class->base
, destroy_component_class
);
98 class->name
= g_string_new(name
);
100 BT_LOGE_STR("Failed to allocate a GString.");
104 class->description
= g_string_new(NULL
);
105 if (!class->description
) {
106 BT_LOGE_STR("Failed to allocate a GString.");
110 class->help
= g_string_new(NULL
);
112 BT_LOGE_STR("Failed to allocate a GString.");
116 class->destroy_listeners
= g_array_new(FALSE
, TRUE
,
117 sizeof(struct bt_component_class_destroy_listener
));
118 if (!class->destroy_listeners
) {
119 BT_LOGE_STR("Failed to allocate a GArray.");
126 BT_OBJECT_PUT_REF_AND_RESET(class);
133 struct bt_private_component_class_source
*
134 bt_private_component_class_source_create(
136 bt_private_component_class_source_notification_iterator_next_method method
)
138 struct bt_component_class_source
*source_class
= NULL
;
141 BT_ASSERT_PRE_NON_NULL(name
, "Name");
142 BT_ASSERT_PRE_NON_NULL(method
, "Notification iterator next method");
143 BT_LOGD("Creating source component class: "
144 "name=\"%s\", notif-iter-next-method-addr=%p",
146 source_class
= g_new0(struct bt_component_class_source
, 1);
148 BT_LOGE_STR("Failed to allocate one source component class.");
152 /* bt_component_class_init() logs errors */
153 ret
= bt_component_class_init(&source_class
->parent
,
154 BT_COMPONENT_CLASS_TYPE_SOURCE
, name
);
157 * If bt_component_class_init() fails, the component
158 * class is put, therefore its memory is already
165 source_class
->methods
.notif_iter_next
= method
;
166 BT_LIB_LOGD("Created source component class: %!+C", source_class
);
169 return (void *) source_class
;
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
)
176 struct bt_component_class_filter
*filter_class
= NULL
;
179 BT_ASSERT_PRE_NON_NULL(name
, "Name");
180 BT_ASSERT_PRE_NON_NULL(method
, "Notification iterator next method");
181 BT_LOGD("Creating filter component class: "
182 "name=\"%s\", notif-iter-next-method-addr=%p",
184 filter_class
= g_new0(struct bt_component_class_filter
, 1);
186 BT_LOGE_STR("Failed to allocate one filter component class.");
190 /* bt_component_class_init() logs errors */
191 ret
= bt_component_class_init(&filter_class
->parent
,
192 BT_COMPONENT_CLASS_TYPE_FILTER
, name
);
195 * If bt_component_class_init() fails, the component
196 * class is put, therefore its memory is already
203 filter_class
->methods
.notif_iter_next
= method
;
204 BT_LIB_LOGD("Created filter component class: %!+C", filter_class
);
207 return (void *) filter_class
;
210 struct bt_private_component_class_sink
*bt_private_component_class_sink_create(
212 bt_private_component_class_sink_consume_method method
)
214 struct bt_component_class_sink
*sink_class
= NULL
;
217 BT_ASSERT_PRE_NON_NULL(name
, "Name");
218 BT_ASSERT_PRE_NON_NULL(method
, "Consume next method");
219 BT_LOGD("Creating sink component class: "
220 "name=\"%s\", consume-method-addr=%p",
222 sink_class
= g_new0(struct bt_component_class_sink
, 1);
224 BT_LOGE_STR("Failed to allocate one sink component class.");
228 /* bt_component_class_init() logs errors */
229 ret
= bt_component_class_init(&sink_class
->parent
,
230 BT_COMPONENT_CLASS_TYPE_SINK
, name
);
233 * If bt_component_class_init() fails, the component
234 * class is put, therefore its memory is already
241 sink_class
->methods
.consume
= method
;
242 BT_LIB_LOGD("Created sink component class: %!+C", sink_class
);
245 return (void *) sink_class
;
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
)
252 struct bt_component_class_source
*comp_cls
= (void *) priv_comp_cls
;
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: "
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
)
267 struct bt_component_class_filter
*comp_cls
= (void *) priv_comp_cls
;
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: "
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
)
282 struct bt_component_class_sink
*comp_cls
= (void *) priv_comp_cls
;
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: "
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
)
297 struct bt_component_class_source
*comp_cls
= (void *) priv_comp_cls
;
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: "
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
)
312 struct bt_component_class_filter
*comp_cls
= (void *) priv_comp_cls
;
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: "
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
)
327 struct bt_component_class_sink
*comp_cls
= (void *) priv_comp_cls
;
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: "
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
)
342 struct bt_component_class_source
*comp_cls
= (void *) priv_comp_cls
;
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: "
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
)
357 struct bt_component_class_filter
*comp_cls
= (void *) priv_comp_cls
;
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: "
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
)
372 struct bt_component_class_sink
*comp_cls
= (void *) priv_comp_cls
;
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: "
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
)
387 struct bt_component_class_filter
*comp_cls
= (void *) priv_comp_cls
;
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"
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
)
402 struct bt_component_class_sink
*comp_cls
= (void *) priv_comp_cls
;
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"
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
)
417 struct bt_component_class_source
*comp_cls
= (void *) priv_comp_cls
;
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"
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
)
432 struct bt_component_class_filter
*comp_cls
= (void *) priv_comp_cls
;
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"
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
)
447 struct bt_component_class_filter
*comp_cls
= (void *) priv_comp_cls
;
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"
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
)
462 struct bt_component_class_sink
*comp_cls
= (void *) priv_comp_cls
;
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"
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
)
477 struct bt_component_class_source
*comp_cls
= (void *) priv_comp_cls
;
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"
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
)
492 struct bt_component_class_filter
*comp_cls
= (void *) priv_comp_cls
;
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"
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
)
507 struct bt_component_class_filter
*comp_cls
= (void *) priv_comp_cls
;
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"
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
)
522 struct bt_component_class_sink
*comp_cls
= (void *) priv_comp_cls
;
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"
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
)
537 struct bt_component_class_source
*comp_cls
= (void *) priv_comp_cls
;
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"
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
)
552 struct bt_component_class_filter
*comp_cls
= (void *) priv_comp_cls
;
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"
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
)
567 struct bt_component_class_source
*comp_cls
= (void *) priv_comp_cls
;
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"
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
)
582 struct bt_component_class_filter
*comp_cls
= (void *) priv_comp_cls
;
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"
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
)
597 struct bt_component_class_source
*comp_cls
= (void *) priv_comp_cls
;
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"
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
)
612 struct bt_component_class_filter
*comp_cls
= (void *) priv_comp_cls
;
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"
623 int bt_private_component_class_set_description(
624 struct bt_private_component_class
*priv_comp_cls
,
625 const char *description
)
627 struct bt_component_class
*comp_cls
= (void *) priv_comp_cls
;
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: "
634 "addr=%p, name=\"%s\", type=%s",
636 bt_component_class_get_name(comp_cls
),
637 bt_component_class_type_string(comp_cls
->type
));
641 int bt_private_component_class_set_help(
642 struct bt_private_component_class
*priv_comp_cls
,
645 struct bt_component_class
*comp_cls
= (void *) priv_comp_cls
;
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
);
655 const char *bt_component_class_get_name(struct bt_component_class
*comp_cls
)
657 BT_ASSERT_PRE_NON_NULL(comp_cls
, "Component class");
658 return comp_cls
->name
->str
;
661 enum bt_component_class_type
bt_component_class_get_type(
662 struct bt_component_class
*comp_cls
)
664 BT_ASSERT_PRE_NON_NULL(comp_cls
, "Component class");
665 return comp_cls
->type
;
668 const char *bt_component_class_get_description(
669 struct bt_component_class
*comp_cls
)
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
;
677 const char *bt_component_class_get_help(
678 struct bt_component_class
*comp_cls
)
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
;
686 void bt_component_class_add_destroy_listener(
687 struct bt_component_class
*comp_cls
,
688 bt_component_class_destroy_listener_func func
, void *data
)
690 struct bt_component_class_destroy_listener listener
;
694 listener
.func
= func
;
695 listener
.data
= data
;
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
);
702 void _bt_component_class_freeze(struct bt_component_class
*comp_cls
)
705 BT_LIB_LOGD("Freezing component class: %!+C", comp_cls
);
706 comp_cls
->frozen
= true;