2 * SPDX-License-Identifier: MIT
4 * Copyright 2017-2019 Philippe Proulx <pproulx@efficios.com>
5 * Copyright 2017 Jérémie Galarneau <jeremie.galarneau@efficios.com>
8 #define BT_LOG_TAG "LIB/COMP-DESCR-SET"
9 #include "lib/logging.h"
11 #include "common/assert.h"
12 #include "lib/assert-cond.h"
13 #include "compat/compiler.h"
14 #include "common/common.h"
15 #include <babeltrace2/types.h>
16 #include <babeltrace2/value.h>
20 #include "component-class.h"
21 #include "component-descriptor-set.h"
22 #include "component-class-sink-simple.h"
23 #include "lib/value.h"
26 void destroy_component_descriptor_set(struct bt_object
*obj
)
28 struct bt_component_descriptor_set
*comp_descr_set
= (void *) obj
;
30 if (comp_descr_set
->sources
) {
31 BT_LOGD_STR("Destroying source component descriptors.");
32 g_ptr_array_free(comp_descr_set
->sources
, TRUE
);
33 comp_descr_set
->sources
= NULL
;
36 if (comp_descr_set
->filters
) {
37 BT_LOGD_STR("Destroying filter component descriptors.");
38 g_ptr_array_free(comp_descr_set
->filters
, TRUE
);
39 comp_descr_set
->filters
= NULL
;
42 if (comp_descr_set
->sinks
) {
43 BT_LOGD_STR("Destroying sink component descriptors.");
44 g_ptr_array_free(comp_descr_set
->sinks
, TRUE
);
45 comp_descr_set
->sinks
= NULL
;
48 g_free(comp_descr_set
);
52 void destroy_component_descriptor_set_entry(gpointer ptr
)
54 struct bt_component_descriptor_set_entry
*entry
= ptr
;
60 BT_OBJECT_PUT_REF_AND_RESET(entry
->comp_cls
);
61 BT_OBJECT_PUT_REF_AND_RESET(entry
->params
);
68 struct bt_component_descriptor_set
*bt_component_descriptor_set_create(void)
70 struct bt_component_descriptor_set
*comp_descr_set
;
72 BT_ASSERT_PRE_NO_ERROR();
74 BT_LOGI_STR("Creating component descriptor set object.");
75 comp_descr_set
= g_new0(struct bt_component_descriptor_set
, 1);
76 if (!comp_descr_set
) {
77 BT_LIB_LOGE_APPEND_CAUSE(
78 "Failed to allocate one component descriptor set.");
82 bt_object_init_shared(&comp_descr_set
->base
,
83 destroy_component_descriptor_set
);
84 comp_descr_set
->sources
= g_ptr_array_new_with_free_func(
85 destroy_component_descriptor_set_entry
);
86 if (!comp_descr_set
->sources
) {
87 BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one GPtrArray.");
91 comp_descr_set
->filters
= g_ptr_array_new_with_free_func(
92 destroy_component_descriptor_set_entry
);
93 if (!comp_descr_set
->filters
) {
94 BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one GPtrArray.");
98 comp_descr_set
->sinks
= g_ptr_array_new_with_free_func(
99 destroy_component_descriptor_set_entry
);
100 if (!comp_descr_set
->sinks
) {
101 BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one GPtrArray.");
105 BT_LOGI("Created component descriptor set object: addr=%p",
110 BT_OBJECT_PUT_REF_AND_RESET(comp_descr_set
);
113 return comp_descr_set
;
116 enum bt_component_descriptor_set_add_descriptor_status
117 bt_component_descriptor_set_add_descriptor_with_initialize_method_data(
118 struct bt_component_descriptor_set
*comp_descr_set
,
119 const struct bt_component_class
*comp_cls
,
120 const struct bt_value
*params
, void *init_method_data
)
122 bt_component_descriptor_set_add_descriptor_status status
=
124 struct bt_value
*new_params
= NULL
;
125 struct bt_component_descriptor_set_entry
*entry
= NULL
;
126 GPtrArray
*comp_descr_array
= NULL
;
128 BT_ASSERT_PRE_NO_ERROR();
129 BT_ASSERT_PRE_COMP_DESCR_SET_NON_NULL(comp_descr_set
);
130 BT_ASSERT_PRE_COMP_CLS_NON_NULL(comp_cls
);
131 BT_ASSERT_PRE_PARAM_VALUE_IS_MAP(params
);
132 BT_LIB_LOGI("Adding component descriptor to set: "
133 "set-addr=%p, %![cc-]+C, "
134 "%![params-]+v, init-method-data-addr=%p",
135 comp_descr_set
, comp_cls
, params
, init_method_data
);
138 new_params
= bt_value_map_create();
140 BT_LIB_LOGE_APPEND_CAUSE(
141 "Cannot create empty map value object.");
142 status
= BT_FUNC_STATUS_MEMORY_ERROR
;
149 entry
= g_new0(struct bt_component_descriptor_set_entry
, 1);
151 BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate a GPtrArray.");
152 status
= BT_FUNC_STATUS_MEMORY_ERROR
;
156 entry
->comp_cls
= (void *) comp_cls
;
157 bt_object_get_ref_no_null_check(entry
->comp_cls
);
158 bt_component_class_freeze(entry
->comp_cls
);
159 entry
->params
= (void *) params
;
160 bt_object_get_ref_no_null_check(entry
->params
);
161 bt_value_freeze(entry
->params
);
162 entry
->init_method_data
= init_method_data
;
165 switch (comp_cls
->type
) {
166 case BT_COMPONENT_CLASS_TYPE_SOURCE
:
167 comp_descr_array
= comp_descr_set
->sources
;
169 case BT_COMPONENT_CLASS_TYPE_FILTER
:
170 comp_descr_array
= comp_descr_set
->filters
;
172 case BT_COMPONENT_CLASS_TYPE_SINK
:
173 comp_descr_array
= comp_descr_set
->sinks
;
179 BT_ASSERT(comp_descr_array
);
180 g_ptr_array_add(comp_descr_array
, entry
);
181 BT_LIB_LOGI("Added component descriptor to set: "
182 "set-addr=%p, %![cc-]+C, "
183 "%![params-]+v, init-method-data-addr=%p",
184 comp_descr_set
, comp_cls
, params
, init_method_data
);
188 destroy_component_descriptor_set_entry(entry
);
192 bt_object_put_ref(new_params
);
196 enum bt_component_descriptor_set_add_descriptor_status
197 bt_component_descriptor_set_add_descriptor(
198 struct bt_component_descriptor_set
*comp_descr_set
,
199 const struct bt_component_class
*comp_cls
,
200 const struct bt_value
*params
)
202 BT_ASSERT_PRE_NO_ERROR();
204 return bt_component_descriptor_set_add_descriptor_with_initialize_method_data(
205 comp_descr_set
, comp_cls
, params
, NULL
);
208 void bt_component_descriptor_set_get_ref(
209 const struct bt_component_descriptor_set
*comp_descr_set
)
211 bt_object_get_ref(comp_descr_set
);
214 void bt_component_descriptor_set_put_ref(
215 const struct bt_component_descriptor_set
*comp_descr_set
)
217 bt_object_put_ref(comp_descr_set
);