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 "lib/value.h"
25 void destroy_component_descriptor_set(struct bt_object
*obj
)
27 struct bt_component_descriptor_set
*comp_descr_set
= (void *) obj
;
29 if (comp_descr_set
->sources
) {
30 BT_LOGD_STR("Destroying source component descriptors.");
31 g_ptr_array_free(comp_descr_set
->sources
, TRUE
);
32 comp_descr_set
->sources
= NULL
;
35 if (comp_descr_set
->filters
) {
36 BT_LOGD_STR("Destroying filter component descriptors.");
37 g_ptr_array_free(comp_descr_set
->filters
, TRUE
);
38 comp_descr_set
->filters
= NULL
;
41 if (comp_descr_set
->sinks
) {
42 BT_LOGD_STR("Destroying sink component descriptors.");
43 g_ptr_array_free(comp_descr_set
->sinks
, TRUE
);
44 comp_descr_set
->sinks
= NULL
;
47 g_free(comp_descr_set
);
51 void destroy_component_descriptor_set_entry(gpointer ptr
)
53 struct bt_component_descriptor_set_entry
*entry
= ptr
;
59 BT_OBJECT_PUT_REF_AND_RESET(entry
->comp_cls
);
60 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
;
117 enum bt_component_descriptor_set_add_descriptor_status
118 bt_component_descriptor_set_add_descriptor_with_initialize_method_data(
119 struct bt_component_descriptor_set
*comp_descr_set
,
120 const struct bt_component_class
*comp_cls
,
121 const struct bt_value
*params
, void *init_method_data
)
123 bt_component_descriptor_set_add_descriptor_status status
=
125 struct bt_value
*new_params
= NULL
;
126 struct bt_component_descriptor_set_entry
*entry
= NULL
;
127 GPtrArray
*comp_descr_array
= NULL
;
129 BT_ASSERT_PRE_NO_ERROR();
130 BT_ASSERT_PRE_COMP_DESCR_SET_NON_NULL(comp_descr_set
);
131 BT_ASSERT_PRE_COMP_CLS_NON_NULL(comp_cls
);
132 BT_ASSERT_PRE_PARAM_VALUE_IS_MAP(params
);
133 BT_LIB_LOGI("Adding component descriptor to set: "
134 "set-addr=%p, %![cc-]+C, "
135 "%![params-]+v, init-method-data-addr=%p",
136 comp_descr_set
, comp_cls
, params
, init_method_data
);
139 new_params
= bt_value_map_create();
141 BT_LIB_LOGE_APPEND_CAUSE(
142 "Cannot create empty map value object.");
143 status
= BT_FUNC_STATUS_MEMORY_ERROR
;
150 entry
= g_new0(struct bt_component_descriptor_set_entry
, 1);
152 BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate a GPtrArray.");
153 status
= BT_FUNC_STATUS_MEMORY_ERROR
;
157 entry
->comp_cls
= (void *) comp_cls
;
158 bt_object_get_ref_no_null_check(entry
->comp_cls
);
159 bt_component_class_freeze(entry
->comp_cls
);
160 entry
->params
= (void *) params
;
161 bt_object_get_ref_no_null_check(entry
->params
);
162 bt_value_freeze(entry
->params
);
163 entry
->init_method_data
= init_method_data
;
166 switch (comp_cls
->type
) {
167 case BT_COMPONENT_CLASS_TYPE_SOURCE
:
168 comp_descr_array
= comp_descr_set
->sources
;
170 case BT_COMPONENT_CLASS_TYPE_FILTER
:
171 comp_descr_array
= comp_descr_set
->filters
;
173 case BT_COMPONENT_CLASS_TYPE_SINK
:
174 comp_descr_array
= comp_descr_set
->sinks
;
180 BT_ASSERT(comp_descr_array
);
181 g_ptr_array_add(comp_descr_array
, entry
);
182 BT_LIB_LOGI("Added component descriptor to set: "
183 "set-addr=%p, %![cc-]+C, "
184 "%![params-]+v, init-method-data-addr=%p",
185 comp_descr_set
, comp_cls
, params
, init_method_data
);
189 destroy_component_descriptor_set_entry(entry
);
193 bt_object_put_ref(new_params
);
198 enum bt_component_descriptor_set_add_descriptor_status
199 bt_component_descriptor_set_add_descriptor(
200 struct bt_component_descriptor_set
*comp_descr_set
,
201 const struct bt_component_class
*comp_cls
,
202 const struct bt_value
*params
)
204 BT_ASSERT_PRE_NO_ERROR();
206 return bt_component_descriptor_set_add_descriptor_with_initialize_method_data(
207 comp_descr_set
, comp_cls
, params
, NULL
);
211 void bt_component_descriptor_set_get_ref(
212 const struct bt_component_descriptor_set
*comp_descr_set
)
214 bt_object_get_ref(comp_descr_set
);
218 void bt_component_descriptor_set_put_ref(
219 const struct bt_component_descriptor_set
*comp_descr_set
)
221 bt_object_put_ref(comp_descr_set
);