2 * Copyright 2017-2018 Philippe Proulx <pproulx@efficios.com>
3 * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 * copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 #define BT_LOG_TAG "FIELD-CLASSES"
25 #include <babeltrace/lib-logging-internal.h>
27 #include <babeltrace/assert-pre-internal.h>
28 #include <babeltrace/trace-ir/field-class.h>
29 #include <babeltrace/trace-ir/field-class-const.h>
30 #include <babeltrace/trace-ir/field-class-internal.h>
31 #include <babeltrace/trace-ir/field-path-internal.h>
32 #include <babeltrace/trace-ir/field-internal.h>
33 #include <babeltrace/trace-ir/field-const.h>
34 #include <babeltrace/trace-ir/field.h>
35 #include <babeltrace/trace-ir/utils-internal.h>
36 #include <babeltrace/trace-ir/clock-class.h>
37 #include <babeltrace/trace-ir/clock-class-internal.h>
38 #include <babeltrace/object-internal.h>
39 #include <babeltrace/compiler-internal.h>
40 #include <babeltrace/endian-internal.h>
41 #include <babeltrace/assert-internal.h>
42 #include <babeltrace/compat/glib-internal.h>
47 enum bt_field_class_type
bt_field_class_get_type(
48 const struct bt_field_class
*fc
)
50 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
55 void init_field_class(struct bt_field_class
*fc
, enum bt_field_class_type type
,
56 bt_object_release_func release_func
)
59 BT_ASSERT(bt_field_class_has_known_type(fc
));
60 BT_ASSERT(release_func
);
61 bt_object_init_shared(&fc
->base
, release_func
);
66 void init_integer_field_class(struct bt_field_class_integer
*fc
,
67 enum bt_field_class_type type
,
68 bt_object_release_func release_func
)
70 init_field_class((void *) fc
, type
, release_func
);
72 fc
->base
= BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL
;
76 void destroy_integer_field_class(struct bt_object
*obj
)
79 BT_LIB_LOGD("Destroying integer field class object: %!+F", obj
);
84 struct bt_field_class
*create_integer_field_class(bt_trace_class
*trace_class
,
85 enum bt_field_class_type type
)
87 struct bt_field_class_integer
*int_fc
= NULL
;
89 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
90 BT_LOGD("Creating default integer field class object: type=%s",
91 bt_common_field_class_type_string(type
));
92 int_fc
= g_new0(struct bt_field_class_integer
, 1);
94 BT_LOGE_STR("Failed to allocate one integer field class.");
98 init_integer_field_class(int_fc
, type
, destroy_integer_field_class
);
99 BT_LIB_LOGD("Created integer field class object: %!+F", int_fc
);
103 BT_OBJECT_PUT_REF_AND_RESET(int_fc
);
106 return (void *) int_fc
;
109 struct bt_field_class
*bt_field_class_unsigned_integer_create(
110 bt_trace_class
*trace_class
)
112 return create_integer_field_class(trace_class
,
113 BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER
);
116 struct bt_field_class
*bt_field_class_signed_integer_create(
117 bt_trace_class
*trace_class
)
119 return create_integer_field_class(trace_class
,
120 BT_FIELD_CLASS_TYPE_SIGNED_INTEGER
);
123 uint64_t bt_field_class_integer_get_field_value_range(
124 const struct bt_field_class
*fc
)
126 const struct bt_field_class_integer
*int_fc
= (const void *) fc
;
128 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
129 BT_ASSERT_PRE_FC_IS_INT(fc
, "Field class");
130 return int_fc
->range
;
135 bool size_is_valid_for_enumeration_field_class(struct bt_field_class
*fc
,
142 void bt_field_class_integer_set_field_value_range(
143 struct bt_field_class
*fc
, uint64_t size
)
145 struct bt_field_class_integer
*int_fc
= (void *) fc
;
147 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
148 BT_ASSERT_PRE_FC_IS_INT(fc
, "Field class");
149 BT_ASSERT_PRE_FC_HOT(fc
, "Field class");
150 BT_ASSERT_PRE(size
<= 64,
151 "Unsupported size for integer field class's field value range "
152 "(maximum is 64): size=%" PRIu64
, size
);
154 int_fc
->common
.type
== BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER
||
155 int_fc
->common
.type
== BT_FIELD_CLASS_TYPE_SIGNED_INTEGER
||
156 size_is_valid_for_enumeration_field_class(fc
, size
),
157 "Invalid field value range for enumeration field class: "
158 "at least one of the current mapping ranges contains values "
159 "which are outside this range: %!+F, size=%" PRIu64
, fc
, size
);
160 int_fc
->range
= size
;
161 BT_LIB_LOGV("Set integer field class's field value range: %!+F", fc
);
164 enum bt_field_class_integer_preferred_display_base
165 bt_field_class_integer_get_preferred_display_base(const struct bt_field_class
*fc
)
167 const struct bt_field_class_integer
*int_fc
= (const void *) fc
;
169 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
170 BT_ASSERT_PRE_FC_IS_INT(fc
, "Field class");
174 void bt_field_class_integer_set_preferred_display_base(
175 struct bt_field_class
*fc
,
176 enum bt_field_class_integer_preferred_display_base base
)
178 struct bt_field_class_integer
*int_fc
= (void *) fc
;
180 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
181 BT_ASSERT_PRE_FC_IS_INT(fc
, "Field class");
182 BT_ASSERT_PRE_FC_HOT(fc
, "Field class");
184 BT_LIB_LOGV("Set integer field class's preferred display base: %!+F", fc
);
188 void finalize_enumeration_field_class_mapping(
189 struct bt_field_class_enumeration_mapping
*mapping
)
193 if (mapping
->label
) {
194 g_string_free(mapping
->label
, TRUE
);
197 if (mapping
->ranges
) {
198 g_array_free(mapping
->ranges
, TRUE
);
203 void destroy_enumeration_field_class(struct bt_object
*obj
)
205 struct bt_field_class_enumeration
*fc
= (void *) obj
;
208 BT_LIB_LOGD("Destroying enumeration field class object: %!+F", fc
);
213 for (i
= 0; i
< fc
->mappings
->len
; i
++) {
214 finalize_enumeration_field_class_mapping(
215 BT_FIELD_CLASS_ENUM_MAPPING_AT_INDEX(fc
, i
));
218 g_array_free(fc
->mappings
, TRUE
);
223 g_ptr_array_free(fc
->label_buf
, TRUE
);
224 fc
->label_buf
= NULL
;
231 struct bt_field_class
*create_enumeration_field_class(
232 bt_trace_class
*trace_class
, enum bt_field_class_type type
)
234 struct bt_field_class_enumeration
*enum_fc
= NULL
;
236 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
237 BT_LOGD("Creating default enumeration field class object: type=%s",
238 bt_common_field_class_type_string(type
));
239 enum_fc
= g_new0(struct bt_field_class_enumeration
, 1);
241 BT_LOGE_STR("Failed to allocate one enumeration field class.");
245 init_integer_field_class((void *) enum_fc
, type
,
246 destroy_enumeration_field_class
);
247 enum_fc
->mappings
= g_array_new(FALSE
, TRUE
,
248 sizeof(struct bt_field_class_enumeration_mapping
));
249 if (!enum_fc
->mappings
) {
250 BT_LOGE_STR("Failed to allocate a GArray.");
254 enum_fc
->label_buf
= g_ptr_array_new();
255 if (!enum_fc
->label_buf
) {
256 BT_LOGE_STR("Failed to allocate a GArray.");
260 BT_LIB_LOGD("Created enumeration field class object: %!+F", enum_fc
);
264 BT_OBJECT_PUT_REF_AND_RESET(enum_fc
);
267 return (void *) enum_fc
;
270 struct bt_field_class
*bt_field_class_unsigned_enumeration_create(
271 bt_trace_class
*trace_class
)
273 return create_enumeration_field_class(trace_class
,
274 BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
);
277 struct bt_field_class
*bt_field_class_signed_enumeration_create(
278 bt_trace_class
*trace_class
)
280 return create_enumeration_field_class(trace_class
,
281 BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION
);
284 uint64_t bt_field_class_enumeration_get_mapping_count(
285 const struct bt_field_class
*fc
)
287 const struct bt_field_class_enumeration
*enum_fc
= (const void *) fc
;
289 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
290 BT_ASSERT_PRE_FC_IS_ENUM(fc
, "Field class");
291 return (uint64_t) enum_fc
->mappings
->len
;
294 void bt_field_class_unsigned_enumeration_borrow_mapping_by_index_const(
295 const struct bt_field_class
*fc
, uint64_t index
,
297 const struct bt_field_class_unsigned_enumeration_mapping_ranges
**ranges
)
299 const struct bt_field_class_enumeration
*enum_fc
= (const void *) fc
;
300 const struct bt_field_class_enumeration_mapping
*mapping
;
302 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
303 BT_ASSERT_PRE_NON_NULL(name
, "Name (output)");
304 BT_ASSERT_PRE_NON_NULL(ranges
, "Ranges (output)");
305 BT_ASSERT_PRE_VALID_INDEX(index
, enum_fc
->mappings
->len
);
306 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
,
308 mapping
= BT_FIELD_CLASS_ENUM_MAPPING_AT_INDEX(fc
, index
);
309 *name
= mapping
->label
->str
;
310 *ranges
= (void *) mapping
;
313 void bt_field_class_signed_enumeration_borrow_mapping_by_index_const(
314 const struct bt_field_class
*fc
, uint64_t index
,
316 const struct bt_field_class_signed_enumeration_mapping_ranges
**ranges
)
318 const struct bt_field_class_enumeration
*enum_fc
= (const void *) fc
;
319 const struct bt_field_class_enumeration_mapping
*mapping
;
321 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
322 BT_ASSERT_PRE_NON_NULL(name
, "Name (output)");
323 BT_ASSERT_PRE_NON_NULL(ranges
, "Ranges (output)");
324 BT_ASSERT_PRE_VALID_INDEX(index
, enum_fc
->mappings
->len
);
325 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION
,
327 mapping
= BT_FIELD_CLASS_ENUM_MAPPING_AT_INDEX(fc
, index
);
328 *name
= mapping
->label
->str
;
329 *ranges
= (void *) mapping
;
333 uint64_t get_enumeration_field_class_mapping_range_count(
334 const struct bt_field_class_enumeration_mapping
*mapping
)
336 BT_ASSERT_PRE_NON_NULL(mapping
, "Ranges");
337 return (uint64_t) mapping
->ranges
->len
;
340 uint64_t bt_field_class_unsigned_enumeration_mapping_ranges_get_range_count(
341 const struct bt_field_class_unsigned_enumeration_mapping_ranges
*ranges
)
343 return get_enumeration_field_class_mapping_range_count(
344 (const void *) ranges
);
347 uint64_t bt_field_class_signed_enumeration_mapping_ranges_get_range_count(
348 const struct bt_field_class_signed_enumeration_mapping_ranges
*ranges
)
350 return get_enumeration_field_class_mapping_range_count(
351 (const void *) ranges
);
355 void get_enumeration_field_class_mapping_range_at_index(
356 const struct bt_field_class_enumeration_mapping
*mapping
,
357 uint64_t index
, uint64_t *lower
, uint64_t *upper
)
359 const struct bt_field_class_enumeration_mapping_range
*range
;
361 BT_ASSERT_PRE_NON_NULL(mapping
, "Ranges");
362 BT_ASSERT_PRE_NON_NULL(lower
, "Range's lower (output)");
363 BT_ASSERT_PRE_NON_NULL(upper
, "Range's upper (output)");
364 BT_ASSERT_PRE_VALID_INDEX(index
, mapping
->ranges
->len
);
365 range
= BT_FIELD_CLASS_ENUM_MAPPING_RANGE_AT_INDEX(mapping
, index
);
366 *lower
= range
->lower
.u
;
367 *upper
= range
->upper
.u
;
370 void bt_field_class_unsigned_enumeration_mapping_ranges_get_range_by_index(
371 const struct bt_field_class_unsigned_enumeration_mapping_ranges
*ranges
,
372 uint64_t index
, uint64_t *lower
, uint64_t *upper
)
374 get_enumeration_field_class_mapping_range_at_index(
375 (const void *) ranges
, index
, lower
, upper
);
378 void bt_field_class_signed_enumeration_mapping_ranges_get_range_by_index(
379 const struct bt_field_class_signed_enumeration_mapping_ranges
*ranges
,
380 uint64_t index
, int64_t *lower
, int64_t *upper
)
382 get_enumeration_field_class_mapping_range_at_index(
383 (const void *) ranges
, index
,
384 (uint64_t *) lower
, (uint64_t *) upper
);
389 enum bt_field_class_status
390 bt_field_class_unsigned_enumeration_get_mapping_labels_by_value(
391 const struct bt_field_class
*fc
, uint64_t value
,
392 bt_field_class_enumeration_mapping_label_array
*label_array
,
395 const struct bt_field_class_enumeration
*enum_fc
= (const void *) fc
;
398 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
399 BT_ASSERT_PRE_NON_NULL(label_array
, "Label array (output)");
400 BT_ASSERT_PRE_NON_NULL(count
, "Count (output)");
401 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
,
403 g_ptr_array_set_size(enum_fc
->label_buf
, 0);
405 for (i
= 0; i
< enum_fc
->mappings
->len
; i
++) {
407 const struct bt_field_class_enumeration_mapping
*mapping
=
408 BT_FIELD_CLASS_ENUM_MAPPING_AT_INDEX(enum_fc
, i
);
410 for (j
= 0; j
< mapping
->ranges
->len
; j
++) {
411 const struct bt_field_class_enumeration_mapping_range
*range
=
412 BT_FIELD_CLASS_ENUM_MAPPING_RANGE_AT_INDEX(
415 if (value
>= range
->lower
.u
&&
416 value
<= range
->upper
.u
) {
417 g_ptr_array_add(enum_fc
->label_buf
,
418 mapping
->label
->str
);
424 *label_array
= (void *) enum_fc
->label_buf
->pdata
;
425 *count
= (uint64_t) enum_fc
->label_buf
->len
;
426 return BT_FIELD_CLASS_STATUS_OK
;
429 enum bt_field_class_status
430 bt_field_class_signed_enumeration_get_mapping_labels_by_value(
431 const struct bt_field_class
*fc
, int64_t value
,
432 bt_field_class_enumeration_mapping_label_array
*label_array
,
435 const struct bt_field_class_enumeration
*enum_fc
= (const void *) fc
;
438 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
439 BT_ASSERT_PRE_NON_NULL(label_array
, "Label array (output)");
440 BT_ASSERT_PRE_NON_NULL(count
, "Count (output)");
441 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION
,
443 g_ptr_array_set_size(enum_fc
->label_buf
, 0);
445 for (i
= 0; i
< enum_fc
->mappings
->len
; i
++) {
447 const struct bt_field_class_enumeration_mapping
*mapping
=
448 BT_FIELD_CLASS_ENUM_MAPPING_AT_INDEX(enum_fc
, i
);
450 for (j
= 0; j
< mapping
->ranges
->len
; j
++) {
451 const struct bt_field_class_enumeration_mapping_range
*range
=
452 BT_FIELD_CLASS_ENUM_MAPPING_RANGE_AT_INDEX(
455 if (value
>= range
->lower
.i
&&
456 value
<= range
->upper
.i
) {
457 g_ptr_array_add(enum_fc
->label_buf
,
458 mapping
->label
->str
);
464 *label_array
= (void *) enum_fc
->label_buf
->pdata
;
465 *count
= (uint64_t) enum_fc
->label_buf
->len
;
466 return BT_FIELD_CLASS_STATUS_OK
;
470 enum bt_field_class_status
add_mapping_to_enumeration_field_class(
471 struct bt_field_class
*fc
,
472 const char *label
, uint64_t lower
, uint64_t upper
)
474 int ret
= BT_FIELD_CLASS_STATUS_OK
;
476 struct bt_field_class_enumeration
*enum_fc
= (void *) fc
;
477 struct bt_field_class_enumeration_mapping
*mapping
= NULL
;
478 struct bt_field_class_enumeration_mapping_range
*range
;
481 BT_ASSERT_PRE_NON_NULL(label
, "Label");
483 /* Find existing mapping identified by this label */
484 for (i
= 0; i
< enum_fc
->mappings
->len
; i
++) {
485 struct bt_field_class_enumeration_mapping
*mapping_candidate
=
486 BT_FIELD_CLASS_ENUM_MAPPING_AT_INDEX(enum_fc
, i
);
488 if (strcmp(mapping_candidate
->label
->str
, label
) == 0) {
489 mapping
= mapping_candidate
;
495 /* Create new mapping for this label */
496 g_array_set_size(enum_fc
->mappings
, enum_fc
->mappings
->len
+ 1);
497 mapping
= BT_FIELD_CLASS_ENUM_MAPPING_AT_INDEX(enum_fc
,
498 enum_fc
->mappings
->len
- 1);
499 mapping
->ranges
= g_array_new(FALSE
, TRUE
,
500 sizeof(struct bt_field_class_enumeration_mapping_range
));
501 if (!mapping
->ranges
) {
502 finalize_enumeration_field_class_mapping(mapping
);
503 g_array_set_size(enum_fc
->mappings
,
504 enum_fc
->mappings
->len
- 1);
505 ret
= BT_FIELD_CLASS_STATUS_NOMEM
;
509 mapping
->label
= g_string_new(label
);
510 if (!mapping
->label
) {
511 finalize_enumeration_field_class_mapping(mapping
);
512 g_array_set_size(enum_fc
->mappings
,
513 enum_fc
->mappings
->len
- 1);
514 ret
= BT_FIELD_CLASS_STATUS_NOMEM
;
521 g_array_set_size(mapping
->ranges
, mapping
->ranges
->len
+ 1);
522 range
= BT_FIELD_CLASS_ENUM_MAPPING_RANGE_AT_INDEX(mapping
,
523 mapping
->ranges
->len
- 1);
524 range
->lower
.u
= lower
;
525 range
->upper
.u
= upper
;
526 BT_LIB_LOGV("Added mapping to enumeration field class: "
527 "%![fc-]+F, label=\"%s\", lower-unsigned=%" PRIu64
", "
528 "upper-unsigned=%" PRIu64
, fc
, label
, lower
, upper
);
534 enum bt_field_class_status
bt_field_class_unsigned_enumeration_map_range(
535 struct bt_field_class
*fc
, const char *label
,
536 uint64_t range_lower
, uint64_t range_upper
)
538 struct bt_field_class_enumeration
*enum_fc
= (void *) fc
;
540 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
541 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
,
543 BT_ASSERT_PRE(range_lower
<= range_upper
,
544 "Range's upper bound is less than lower bound: "
545 "upper=%" PRIu64
", lower=%" PRIu64
,
546 range_lower
, range_upper
);
547 BT_ASSERT_PRE(bt_util_value_is_in_range_unsigned(enum_fc
->common
.range
,
549 "Range's lower bound is outside the enumeration field class's value range: "
550 "%![fc-]+F, lower=%" PRIu64
, fc
, range_lower
);
551 BT_ASSERT_PRE(bt_util_value_is_in_range_unsigned(enum_fc
->common
.range
,
553 "Range's upper bound is outside the enumeration field class's value range: "
554 "%![fc-]+F, upper=%" PRIu64
, fc
, range_upper
);
555 return add_mapping_to_enumeration_field_class(fc
, label
, range_lower
,
559 enum bt_field_class_status
bt_field_class_signed_enumeration_map_range(
560 struct bt_field_class
*fc
, const char *label
,
561 int64_t range_lower
, int64_t range_upper
)
563 struct bt_field_class_enumeration
*enum_fc
= (void *) fc
;
565 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
566 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION
,
568 BT_ASSERT_PRE(range_lower
<= range_upper
,
569 "Range's upper bound is less than lower bound: "
570 "upper=%" PRId64
", lower=%" PRId64
,
571 range_lower
, range_upper
);
572 BT_ASSERT_PRE(bt_util_value_is_in_range_signed(enum_fc
->common
.range
,
574 "Range's lower bound is outside the enumeration field class's value range: "
575 "%![fc-]+F, lower=%" PRId64
, fc
, range_lower
);
576 BT_ASSERT_PRE(bt_util_value_is_in_range_signed(enum_fc
->common
.range
,
578 "Range's upper bound is outside the enumeration field class's value range: "
579 "%![fc-]+F, upper=%" PRId64
, fc
, range_upper
);
580 return add_mapping_to_enumeration_field_class(fc
, label
, range_lower
,
585 void destroy_real_field_class(struct bt_object
*obj
)
588 BT_LIB_LOGD("Destroying real field class object: %!+F", obj
);
592 struct bt_field_class
*bt_field_class_real_create(bt_trace_class
*trace_class
)
594 struct bt_field_class_real
*real_fc
= NULL
;
596 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
597 BT_LOGD_STR("Creating default real field class object.");
598 real_fc
= g_new0(struct bt_field_class_real
, 1);
600 BT_LOGE_STR("Failed to allocate one real field class.");
604 init_field_class((void *) real_fc
, BT_FIELD_CLASS_TYPE_REAL
,
605 destroy_real_field_class
);
606 BT_LIB_LOGD("Created real field class object: %!+F", real_fc
);
610 BT_OBJECT_PUT_REF_AND_RESET(real_fc
);
613 return (void *) real_fc
;
616 bt_bool
bt_field_class_real_is_single_precision(const struct bt_field_class
*fc
)
618 const struct bt_field_class_real
*real_fc
= (const void *) fc
;
620 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
621 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_REAL
, "Field class");
622 return real_fc
->is_single_precision
;
625 void bt_field_class_real_set_is_single_precision(struct bt_field_class
*fc
,
626 bt_bool is_single_precision
)
628 struct bt_field_class_real
*real_fc
= (void *) fc
;
630 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
631 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_REAL
, "Field class");
632 BT_ASSERT_PRE_FC_HOT(fc
, "Field class");
633 real_fc
->is_single_precision
= (bool) is_single_precision
;
634 BT_LIB_LOGV("Set real field class's \"is single precision\" property: "
639 int init_named_field_classes_container(
640 struct bt_field_class_named_field_class_container
*fc
,
641 enum bt_field_class_type type
,
642 bt_object_release_func release_func
)
646 init_field_class((void *) fc
, type
, release_func
);
647 fc
->named_fcs
= g_array_new(FALSE
, TRUE
,
648 sizeof(struct bt_named_field_class
));
649 if (!fc
->named_fcs
) {
650 BT_LOGE_STR("Failed to allocate a GArray.");
655 fc
->name_to_index
= g_hash_table_new(g_str_hash
, g_str_equal
);
656 if (!fc
->name_to_index
) {
657 BT_LOGE_STR("Failed to allocate a GHashTable.");
667 void finalize_named_field_class(struct bt_named_field_class
*named_fc
)
670 BT_LIB_LOGD("Finalizing named field class: "
671 "addr=%p, name=\"%s\", %![fc-]+F",
672 named_fc
, named_fc
->name
? named_fc
->name
->str
: NULL
,
675 if (named_fc
->name
) {
676 g_string_free(named_fc
->name
, TRUE
);
679 BT_LOGD_STR("Putting named field class's field class.");
680 BT_OBJECT_PUT_REF_AND_RESET(named_fc
->fc
);
684 void finalize_named_field_classes_container(
685 struct bt_field_class_named_field_class_container
*fc
)
692 for (i
= 0; i
< fc
->named_fcs
->len
; i
++) {
693 finalize_named_field_class(
694 &g_array_index(fc
->named_fcs
,
695 struct bt_named_field_class
, i
));
698 g_array_free(fc
->named_fcs
, TRUE
);
701 if (fc
->name_to_index
) {
702 g_hash_table_destroy(fc
->name_to_index
);
707 void destroy_structure_field_class(struct bt_object
*obj
)
710 BT_LIB_LOGD("Destroying structure field class object: %!+F", obj
);
711 finalize_named_field_classes_container((void *) obj
);
715 struct bt_field_class
*bt_field_class_structure_create(
716 bt_trace_class
*trace_class
)
719 struct bt_field_class_structure
*struct_fc
= NULL
;
721 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
722 BT_LOGD_STR("Creating default structure field class object.");
723 struct_fc
= g_new0(struct bt_field_class_structure
, 1);
725 BT_LOGE_STR("Failed to allocate one structure field class.");
729 ret
= init_named_field_classes_container((void *) struct_fc
,
730 BT_FIELD_CLASS_TYPE_STRUCTURE
, destroy_structure_field_class
);
735 BT_LIB_LOGD("Created structure field class object: %!+F", struct_fc
);
739 BT_OBJECT_PUT_REF_AND_RESET(struct_fc
);
742 return (void *) struct_fc
;
746 enum bt_field_class_status
append_named_field_class_to_container_field_class(
747 struct bt_field_class_named_field_class_container
*container_fc
,
748 const char *name
, struct bt_field_class
*fc
)
750 int ret
= BT_FIELD_CLASS_STATUS_OK
;
751 struct bt_named_field_class
*named_fc
;
754 BT_ASSERT(container_fc
);
755 BT_ASSERT_PRE_FC_HOT(container_fc
, "Field class");
756 BT_ASSERT_PRE_NON_NULL(name
, "Name");
757 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
758 BT_ASSERT_PRE(!bt_g_hash_table_contains(container_fc
->name_to_index
,
760 "Duplicate member/option name in structure/variant field class: "
761 "%![container-fc-]+F, name=\"%s\"", container_fc
, name
);
762 name_str
= g_string_new(name
);
764 BT_LOGE_STR("Failed to allocate a GString.");
765 ret
= BT_FIELD_CLASS_STATUS_NOMEM
;
769 g_array_set_size(container_fc
->named_fcs
,
770 container_fc
->named_fcs
->len
+ 1);
771 named_fc
= &g_array_index(container_fc
->named_fcs
,
772 struct bt_named_field_class
, container_fc
->named_fcs
->len
- 1);
773 named_fc
->name
= name_str
;
775 bt_object_get_no_null_check(fc
);
776 g_hash_table_insert(container_fc
->name_to_index
, named_fc
->name
->str
,
777 GUINT_TO_POINTER(container_fc
->named_fcs
->len
- 1));
780 * Freeze the field class, but not the named field class (the
781 * user can still modify it, if possible, until the container
784 bt_field_class_freeze(fc
);
790 enum bt_field_class_status
bt_field_class_structure_append_member(
791 struct bt_field_class
*fc
, const char *name
,
792 struct bt_field_class
*member_fc
)
795 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
796 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_STRUCTURE
,
798 return append_named_field_class_to_container_field_class((void *) fc
,
802 uint64_t bt_field_class_structure_get_member_count(
803 const struct bt_field_class
*fc
)
805 struct bt_field_class_structure
*struct_fc
= (void *) fc
;
807 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
808 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_STRUCTURE
,
810 return (uint64_t) struct_fc
->common
.named_fcs
->len
;
814 struct bt_named_field_class
*
815 borrow_named_field_class_from_container_field_class_at_index(
816 struct bt_field_class_named_field_class_container
*fc
,
820 BT_ASSERT_PRE_VALID_INDEX(index
, fc
->named_fcs
->len
);
821 return BT_FIELD_CLASS_NAMED_FC_AT_INDEX(fc
, index
);
824 const struct bt_field_class_structure_member
*
825 bt_field_class_structure_borrow_member_by_index_const(
826 const struct bt_field_class
*fc
, uint64_t index
)
828 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
829 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_STRUCTURE
,
831 return (const void *)
832 borrow_named_field_class_from_container_field_class_at_index(
836 struct bt_field_class_structure_member
*
837 bt_field_class_structure_borrow_member_by_index(
838 struct bt_field_class
*fc
, uint64_t index
)
840 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
841 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_STRUCTURE
,
844 borrow_named_field_class_from_container_field_class_at_index(
849 struct bt_named_field_class
*
850 borrow_named_field_class_from_container_field_class_by_name(
851 struct bt_field_class_named_field_class_container
*fc
,
854 struct bt_named_field_class
*named_fc
= NULL
;
859 BT_ASSERT_PRE_NON_NULL(name
, "Name");
860 if (!g_hash_table_lookup_extended(fc
->name_to_index
, name
, &orig_key
,
865 named_fc
= BT_FIELD_CLASS_NAMED_FC_AT_INDEX(fc
,
866 GPOINTER_TO_UINT(value
));
872 const struct bt_field_class_structure_member
*
873 bt_field_class_structure_borrow_member_by_name_const(
874 const struct bt_field_class
*fc
, const char *name
)
876 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
877 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_STRUCTURE
,
879 return (const void *)
880 borrow_named_field_class_from_container_field_class_by_name(
884 struct bt_field_class_structure_member
*
885 bt_field_class_structure_borrow_member_by_name(
886 struct bt_field_class
*fc
, const char *name
)
888 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
889 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_STRUCTURE
,
892 borrow_named_field_class_from_container_field_class_by_name(
896 const char *bt_field_class_structure_member_get_name(
897 const struct bt_field_class_structure_member
*member
)
899 const struct bt_named_field_class
*named_fc
= (const void *) member
;
901 BT_ASSERT_PRE_NON_NULL(member
, "Structure field class member");
902 return named_fc
->name
->str
;
905 const struct bt_field_class
*
906 bt_field_class_structure_member_borrow_field_class_const(
907 const struct bt_field_class_structure_member
*member
)
909 const struct bt_named_field_class
*named_fc
= (const void *) member
;
911 BT_ASSERT_PRE_NON_NULL(member
, "Structure field class member");
915 struct bt_field_class
*
916 bt_field_class_structure_member_borrow_field_class(
917 struct bt_field_class_structure_member
*member
)
919 struct bt_named_field_class
*named_fc
= (void *) member
;
921 BT_ASSERT_PRE_NON_NULL(member
, "Structure field class member");
926 void destroy_variant_field_class(struct bt_object
*obj
)
928 struct bt_field_class_variant
*fc
= (void *) obj
;
931 BT_LIB_LOGD("Destroying variant field class object: %!+F", fc
);
932 finalize_named_field_classes_container((void *) fc
);
933 BT_LOGD_STR("Putting selector field path.");
934 BT_OBJECT_PUT_REF_AND_RESET(fc
->selector_field_path
);
935 BT_LOGD_STR("Putting selector field class.");
936 BT_OBJECT_PUT_REF_AND_RESET(fc
->selector_fc
);
940 struct bt_field_class
*bt_field_class_variant_create(
941 bt_trace_class
*trace_class
)
944 struct bt_field_class_variant
*var_fc
= NULL
;
946 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
947 BT_LOGD_STR("Creating default variant field class object.");
948 var_fc
= g_new0(struct bt_field_class_variant
, 1);
950 BT_LOGE_STR("Failed to allocate one variant field class.");
954 ret
= init_named_field_classes_container((void *) var_fc
,
955 BT_FIELD_CLASS_TYPE_VARIANT
, destroy_variant_field_class
);
960 BT_LIB_LOGD("Created variant field class object: %!+F", var_fc
);
964 BT_OBJECT_PUT_REF_AND_RESET(var_fc
);
967 return (void *) var_fc
;
970 enum bt_field_class_status
bt_field_class_variant_set_selector_field_class(
971 struct bt_field_class
*fc
,
972 struct bt_field_class
*selector_fc
)
974 struct bt_field_class_variant
*var_fc
= (void *) fc
;
976 BT_ASSERT_PRE_NON_NULL(fc
, "Variant field class");
977 BT_ASSERT_PRE_NON_NULL(selector_fc
, "Selector field class");
978 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_VARIANT
, "Field class");
979 BT_ASSERT_PRE_FC_IS_ENUM(selector_fc
, "Selector field class");
980 BT_ASSERT_PRE_FC_HOT(fc
, "Variant field class");
981 var_fc
->selector_fc
= selector_fc
;
982 bt_object_get_no_null_check(selector_fc
);
983 bt_field_class_freeze(selector_fc
);
984 return BT_FIELD_CLASS_STATUS_OK
;
987 enum bt_field_class_status
bt_field_class_variant_append_option(
988 struct bt_field_class
*fc
,
989 const char *name
, struct bt_field_class
*option_fc
)
992 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
993 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_VARIANT
, "Field class");
994 return append_named_field_class_to_container_field_class((void *) fc
,
998 const struct bt_field_class_variant_option
*
999 bt_field_class_variant_borrow_option_by_name_const(
1000 const struct bt_field_class
*fc
, const char *name
)
1002 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1003 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_VARIANT
, "Field class");
1004 return (const void *)
1005 borrow_named_field_class_from_container_field_class_by_name(
1009 struct bt_field_class_variant_option
*
1010 bt_field_class_variant_borrow_option_by_name(
1011 struct bt_field_class
*fc
, const char *name
)
1013 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1014 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_VARIANT
, "Field class");
1016 borrow_named_field_class_from_container_field_class_by_name(
1020 uint64_t bt_field_class_variant_get_option_count(const struct bt_field_class
*fc
)
1022 const struct bt_field_class_variant
*var_fc
= (const void *) fc
;
1024 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1025 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_VARIANT
, "Field class");
1026 return (uint64_t) var_fc
->common
.named_fcs
->len
;
1029 const struct bt_field_class_variant_option
*
1030 bt_field_class_variant_borrow_option_by_index_const(
1031 const struct bt_field_class
*fc
, uint64_t index
)
1033 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1034 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_VARIANT
, "Field class");
1035 return (const void *)
1036 borrow_named_field_class_from_container_field_class_at_index(
1037 (void *) fc
, index
);
1040 struct bt_field_class_variant_option
*
1041 bt_field_class_variant_borrow_option_by_index(
1042 struct bt_field_class
*fc
, uint64_t index
)
1044 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1045 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_VARIANT
, "Field class");
1047 borrow_named_field_class_from_container_field_class_at_index(
1048 (void *) fc
, index
);
1051 const char *bt_field_class_variant_option_get_name(
1052 const struct bt_field_class_variant_option
*option
)
1054 const struct bt_named_field_class
*named_fc
= (const void *) option
;
1056 BT_ASSERT_PRE_NON_NULL(option
, "Variant field class option");
1057 return named_fc
->name
->str
;
1060 const struct bt_field_class
*
1061 bt_field_class_variant_option_borrow_field_class_const(
1062 const struct bt_field_class_variant_option
*option
)
1064 const struct bt_named_field_class
*named_fc
= (const void *) option
;
1066 BT_ASSERT_PRE_NON_NULL(option
, "Variant field class option");
1067 return named_fc
->fc
;
1070 struct bt_field_class
*
1071 bt_field_class_variant_option_borrow_field_class(
1072 struct bt_field_class_variant_option
*option
)
1074 struct bt_named_field_class
*named_fc
= (void *) option
;
1076 BT_ASSERT_PRE_NON_NULL(option
, "Variant field class option");
1077 return named_fc
->fc
;
1080 const struct bt_field_path
*
1081 bt_field_class_variant_borrow_selector_field_path_const(
1082 const struct bt_field_class
*fc
)
1084 const struct bt_field_class_variant
*var_fc
= (const void *) fc
;
1086 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1087 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_VARIANT
,
1089 return var_fc
->selector_field_path
;
1093 void init_array_field_class(struct bt_field_class_array
*fc
,
1094 enum bt_field_class_type type
, bt_object_release_func release_func
,
1095 struct bt_field_class
*element_fc
)
1097 BT_ASSERT(element_fc
);
1098 init_field_class((void *) fc
, type
, release_func
);
1099 fc
->element_fc
= element_fc
;
1100 bt_object_get_no_null_check(element_fc
);
1101 bt_field_class_freeze(element_fc
);
1105 void finalize_array_field_class(struct bt_field_class_array
*array_fc
)
1107 BT_ASSERT(array_fc
);
1108 BT_LOGD_STR("Putting element field class.");
1109 BT_OBJECT_PUT_REF_AND_RESET(array_fc
->element_fc
);
1113 void destroy_static_array_field_class(struct bt_object
*obj
)
1116 BT_LIB_LOGD("Destroying static array field class object: %!+F", obj
);
1117 finalize_array_field_class((void *) obj
);
1121 struct bt_field_class
*
1122 bt_field_class_static_array_create(bt_trace_class
*trace_class
,
1123 struct bt_field_class
*element_fc
, uint64_t length
)
1125 struct bt_field_class_static_array
*array_fc
= NULL
;
1127 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
1128 BT_ASSERT_PRE_NON_NULL(element_fc
, "Element field class");
1129 BT_LOGD_STR("Creating default static array field class object.");
1130 array_fc
= g_new0(struct bt_field_class_static_array
, 1);
1132 BT_LOGE_STR("Failed to allocate one static array field class.");
1136 init_array_field_class((void *) array_fc
, BT_FIELD_CLASS_TYPE_STATIC_ARRAY
,
1137 destroy_static_array_field_class
, element_fc
);
1138 array_fc
->length
= length
;
1139 BT_LIB_LOGD("Created static array field class object: %!+F", array_fc
);
1143 BT_OBJECT_PUT_REF_AND_RESET(array_fc
);
1146 return (void *) array_fc
;
1149 const struct bt_field_class
*
1150 bt_field_class_array_borrow_element_field_class_const(
1151 const struct bt_field_class
*fc
)
1153 const struct bt_field_class_array
*array_fc
= (const void *) fc
;
1155 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1156 BT_ASSERT_PRE_FC_IS_ARRAY(fc
, "Field class");
1157 return array_fc
->element_fc
;
1160 struct bt_field_class
*
1161 bt_field_class_array_borrow_element_field_class(struct bt_field_class
*fc
)
1163 struct bt_field_class_array
*array_fc
= (void *) fc
;
1165 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1166 BT_ASSERT_PRE_FC_IS_ARRAY(fc
, "Field class");
1167 return array_fc
->element_fc
;
1170 uint64_t bt_field_class_static_array_get_length(const struct bt_field_class
*fc
)
1172 const struct bt_field_class_static_array
*array_fc
= (const void *) fc
;
1174 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1175 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_STATIC_ARRAY
,
1177 return (uint64_t) array_fc
->length
;
1181 void destroy_dynamic_array_field_class(struct bt_object
*obj
)
1183 struct bt_field_class_dynamic_array
*fc
= (void *) obj
;
1186 BT_LIB_LOGD("Destroying dynamic array field class object: %!+F", fc
);
1187 finalize_array_field_class((void *) fc
);
1188 BT_LOGD_STR("Putting length field path.");
1189 BT_OBJECT_PUT_REF_AND_RESET(fc
->length_field_path
);
1190 BT_LOGD_STR("Putting length field class.");
1191 BT_OBJECT_PUT_REF_AND_RESET(fc
->length_fc
);
1195 struct bt_field_class
*bt_field_class_dynamic_array_create(
1196 bt_trace_class
*trace_class
,
1197 struct bt_field_class
*element_fc
)
1199 struct bt_field_class_dynamic_array
*array_fc
= NULL
;
1201 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
1202 BT_ASSERT_PRE_NON_NULL(element_fc
, "Element field class");
1203 BT_LOGD_STR("Creating default dynamic array field class object.");
1204 array_fc
= g_new0(struct bt_field_class_dynamic_array
, 1);
1206 BT_LOGE_STR("Failed to allocate one dynamic array field class.");
1210 init_array_field_class((void *) array_fc
,
1211 BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY
,
1212 destroy_dynamic_array_field_class
, element_fc
);
1213 BT_LIB_LOGD("Created dynamic array field class object: %!+F", array_fc
);
1217 BT_OBJECT_PUT_REF_AND_RESET(array_fc
);
1220 return (void *) array_fc
;
1223 enum bt_field_class_status
bt_field_class_dynamic_array_set_length_field_class(
1224 struct bt_field_class
*fc
,
1225 struct bt_field_class
*length_fc
)
1227 struct bt_field_class_dynamic_array
*array_fc
= (void *) fc
;
1229 BT_ASSERT_PRE_NON_NULL(fc
, "Dynamic array field class");
1230 BT_ASSERT_PRE_NON_NULL(length_fc
, "Length field class");
1231 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY
,
1233 BT_ASSERT_PRE_FC_IS_UNSIGNED_INT(length_fc
, "Length field class");
1234 BT_ASSERT_PRE_FC_HOT(fc
, "Dynamic array field class");
1235 array_fc
->length_fc
= length_fc
;
1236 bt_object_get_no_null_check(length_fc
);
1237 bt_field_class_freeze(length_fc
);
1238 return BT_FIELD_CLASS_STATUS_OK
;
1241 const struct bt_field_path
*
1242 bt_field_class_dynamic_array_borrow_length_field_path_const(
1243 const struct bt_field_class
*fc
)
1245 const struct bt_field_class_dynamic_array
*seq_fc
= (const void *) fc
;
1247 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1248 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY
,
1250 return seq_fc
->length_field_path
;
1254 void destroy_string_field_class(struct bt_object
*obj
)
1257 BT_LIB_LOGD("Destroying string field class object: %!+F", obj
);
1261 struct bt_field_class
*bt_field_class_string_create(bt_trace_class
*trace_class
)
1263 struct bt_field_class_string
*string_fc
= NULL
;
1265 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
1266 BT_LOGD_STR("Creating default string field class object.");
1267 string_fc
= g_new0(struct bt_field_class_string
, 1);
1269 BT_LOGE_STR("Failed to allocate one string field class.");
1273 init_field_class((void *) string_fc
, BT_FIELD_CLASS_TYPE_STRING
,
1274 destroy_string_field_class
);
1275 BT_LIB_LOGD("Created string field class object: %!+F", string_fc
);
1279 BT_OBJECT_PUT_REF_AND_RESET(string_fc
);
1282 return (void *) string_fc
;
1286 void _bt_field_class_freeze(const struct bt_field_class
*c_fc
)
1288 struct bt_field_class
*fc
= (void *) c_fc
;
1291 * Element/member/option field classes are frozen when added to
1298 case BT_FIELD_CLASS_TYPE_STRUCTURE
:
1299 case BT_FIELD_CLASS_TYPE_VARIANT
:
1301 struct bt_field_class_named_field_class_container
*container_fc
=
1305 for (i
= 0; i
< container_fc
->named_fcs
->len
; i
++) {
1306 struct bt_named_field_class
*named_fc
=
1307 BT_FIELD_CLASS_NAMED_FC_AT_INDEX(
1310 bt_named_field_class_freeze(named_fc
);
1321 void _bt_named_field_class_freeze(const struct bt_named_field_class
*named_fc
)
1323 BT_ASSERT(named_fc
);
1324 ((struct bt_named_field_class
*) named_fc
)->frozen
= true;
1325 bt_field_class_freeze(named_fc
->fc
);
1329 void _bt_field_class_make_part_of_trace_class(const struct bt_field_class
*c_fc
)
1331 struct bt_field_class
*fc
= (void *) c_fc
;
1334 BT_ASSERT_PRE(!fc
->part_of_trace_class
,
1335 "Field class is already part of a trace: %!+F", fc
);
1336 fc
->part_of_trace_class
= true;
1339 case BT_FIELD_CLASS_TYPE_STRUCTURE
:
1340 case BT_FIELD_CLASS_TYPE_VARIANT
:
1342 struct bt_field_class_named_field_class_container
*container_fc
=
1346 for (i
= 0; i
< container_fc
->named_fcs
->len
; i
++) {
1347 struct bt_named_field_class
*named_fc
=
1348 BT_FIELD_CLASS_NAMED_FC_AT_INDEX(
1351 bt_field_class_make_part_of_trace_class(named_fc
->fc
);
1356 case BT_FIELD_CLASS_TYPE_STATIC_ARRAY
:
1357 case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY
:
1359 struct bt_field_class_array
*array_fc
= (void *) fc
;
1361 bt_field_class_make_part_of_trace_class(array_fc
->element_fc
);
1369 void bt_field_class_get_ref(const struct bt_field_class
*field_class
)
1371 bt_object_get_ref(field_class
);
1374 void bt_field_class_put_ref(const struct bt_field_class
*field_class
)
1376 bt_object_put_ref(field_class
);