2 * SPDX-License-Identifier: MIT
4 * Copyright 2019 Philippe Proulx <pproulx@efficios.com>
7 #define BT_LOG_TAG "LIB/MIP"
8 #include "lib/logging.h"
10 #include "lib/assert-cond.h"
14 #include <babeltrace2/graph/graph.h>
16 #include "common/assert.h"
17 #include "compat/compiler.h"
18 #include "common/common.h"
19 #include "lib/func-status.h"
20 #include "lib/graph/component-class.h"
21 #include "lib/value.h"
22 #include "component-descriptor-set.h"
23 #include "lib/integer-range-set.h"
26 bool unsigned_integer_range_set_contains(
27 const struct bt_integer_range_set
*range_set
, uint64_t value
)
29 bool contains
= false;
34 for (i
= 0; i
< range_set
->ranges
->len
; i
++) {
35 const struct bt_integer_range
*range
=
36 BT_INTEGER_RANGE_SET_RANGE_AT_INDEX(range_set
, i
);
38 if (value
>= range
->lower
.u
&& value
<= range
->upper
.u
) {
49 * As of this version, this function only validates that all the
50 * component descriptors in `descriptors` support MIP version 0, which
51 * is the only version supported by this library.
53 * If any component descriptor does not support MIP version 0, then this
54 * function returns `BT_FUNC_STATUS_NO_MATCH`.
57 int validate_operative_mip_version_in_array(GPtrArray
*descriptors
,
58 enum bt_logging_level log_level
)
60 typedef bt_component_class_get_supported_mip_versions_method_status
62 void * /* component class */,
63 const struct bt_value
*,
64 void * /* init method data */,
65 enum bt_logging_level
,
66 struct bt_integer_range_set
*);
68 int status
= BT_FUNC_STATUS_OK
;
70 struct bt_integer_range_set
*range_set
= NULL
;
72 for (i
= 0; i
< descriptors
->len
; i
++) {
73 struct bt_component_descriptor_set_entry
*descr
=
74 descriptors
->pdata
[i
];
75 method_t method
= NULL
;
76 const char *method_name
= NULL
;
77 bt_component_class_get_supported_mip_versions_method_status method_status
;
79 switch (descr
->comp_cls
->type
) {
80 case BT_COMPONENT_CLASS_TYPE_SOURCE
:
82 struct bt_component_class_source
*src_cc
= (void *)
85 method
= (method_t
) src_cc
->methods
.get_supported_mip_versions
;
86 method_name
= "bt_component_class_source_get_supported_mip_versions_method";
89 case BT_COMPONENT_CLASS_TYPE_FILTER
:
91 struct bt_component_class_filter
*flt_cc
= (void *)
94 method
= (method_t
) flt_cc
->methods
.get_supported_mip_versions
;
95 method_name
= "bt_component_class_filter_get_supported_mip_versions_method";
98 case BT_COMPONENT_CLASS_TYPE_SINK
:
100 struct bt_component_class_sink
*sink_cc
= (void *)
103 method
= (method_t
) sink_cc
->methods
.get_supported_mip_versions
;
104 method_name
= "bt_component_class_sink_get_supported_mip_versions_method";
116 range_set
= (void *) bt_integer_range_set_unsigned_create();
118 status
= BT_FUNC_STATUS_MEMORY_ERROR
;
122 BT_ASSERT(descr
->params
);
123 BT_LIB_LOGD("Calling user's \"get supported MIP versions\" method: "
124 "%![cc-]+C, %![params-]+v, init-method-data=%p, "
126 descr
->comp_cls
, descr
->params
,
127 descr
->init_method_data
,
128 bt_common_logging_level_string(log_level
));
129 method_status
= method(descr
->comp_cls
, descr
->params
,
130 descr
->init_method_data
, log_level
,
132 BT_LIB_LOGD("User method returned: status=%s",
133 bt_common_func_status_string(method_status
));
134 BT_ASSERT_POST(method_name
, "status-ok-with-at-least-one-range",
135 method_status
!= BT_FUNC_STATUS_OK
||
136 range_set
->ranges
->len
> 0,
137 "User method returned `BT_FUNC_STATUS_OK` without "
138 "adding a range to the supported MIP version range set.");
139 BT_ASSERT_POST_NO_ERROR_IF_NO_ERROR_STATUS(method_name
,
141 if (method_status
< 0) {
142 BT_LIB_LOGW_APPEND_CAUSE(
143 "Component class's \"get supported MIP versions\" method failed: "
144 "%![cc-]+C, %![params-]+v, init-method-data=%p, "
146 descr
->comp_cls
, descr
->params
,
147 descr
->init_method_data
,
148 bt_common_logging_level_string(log_level
));
149 status
= (int) method_status
;
153 if (!unsigned_integer_range_set_contains(range_set
, 0)) {
155 * Supported MIP versions do not include 0,
156 * which is the only MIP versions currently
157 * supported by the library itself.
159 status
= BT_FUNC_STATUS_NO_MATCH
;
163 BT_OBJECT_PUT_REF_AND_RESET(range_set
);
167 bt_object_put_ref(range_set
);
172 * The purpose of this function is eventually to find the greatest
173 * common supported MIP version amongst all the component descriptors.
174 * But as of this version of the library, only MIP version 0 is
175 * supported, so it only checks that they all support MIP version 0 and
176 * always sets `*operative_mip_version` to 0.
178 * When any component descriptor does not support MIP version 0, this
179 * function returns `BT_FUNC_STATUS_NO_MATCH`.
182 enum bt_get_greatest_operative_mip_version_status
183 bt_get_greatest_operative_mip_version(
184 const struct bt_component_descriptor_set
*comp_descr_set
,
185 enum bt_logging_level log_level
,
186 uint64_t *operative_mip_version
)
188 int status
= BT_FUNC_STATUS_OK
;
190 BT_ASSERT_PRE_NO_ERROR();
191 BT_ASSERT_PRE_COMP_DESCR_SET_NON_NULL(comp_descr_set
);
192 BT_ASSERT_PRE_NON_NULL("operative-mip-version-output",
193 operative_mip_version
,
194 "Operative MIP version (output)");
195 BT_ASSERT_PRE("component-descriptor-set-is-not-empty",
196 comp_descr_set
->sources
->len
+
197 comp_descr_set
->filters
->len
+
198 comp_descr_set
->sinks
->len
> 0,
199 "Component descriptor set is empty: addr=%p", comp_descr_set
);
200 status
= validate_operative_mip_version_in_array(
201 comp_descr_set
->sources
, log_level
);
206 status
= validate_operative_mip_version_in_array(
207 comp_descr_set
->filters
, log_level
);
212 status
= validate_operative_mip_version_in_array(
213 comp_descr_set
->sinks
, log_level
);
218 *operative_mip_version
= 0;
225 uint64_t bt_get_maximal_mip_version(void)