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 "LIB/FIELD-CLASS"
25 #include "lib/logging.h"
27 #include "lib/assert-pre.h"
28 #include <babeltrace2/trace-ir/field-class.h>
29 #include <babeltrace2/trace-ir/field-class-const.h>
30 #include <babeltrace2/trace-ir/field-const.h>
31 #include <babeltrace2/trace-ir/field.h>
32 #include <babeltrace2/trace-ir/clock-class.h>
33 #include "lib/object.h"
34 #include "compat/compiler.h"
35 #include "compat/endian.h"
36 #include "common/assert.h"
37 #include "compat/glib.h"
42 #include "clock-class.h"
43 #include "field-class.h"
45 #include "field-path.h"
47 #include "lib/func-status.h"
48 #include "lib/integer-range-set.h"
49 #include "lib/value.h"
51 enum bt_field_class_type
bt_field_class_get_type(
52 const struct bt_field_class
*fc
)
54 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
59 int init_field_class(struct bt_field_class
*fc
, enum bt_field_class_type type
,
60 bt_object_release_func release_func
)
65 BT_ASSERT(release_func
);
66 bt_object_init_shared(&fc
->base
, release_func
);
68 fc
->user_attributes
= bt_value_map_create();
69 if (!fc
->user_attributes
) {
70 BT_LIB_LOGE_APPEND_CAUSE(
71 "Failed to create a map value object.");
81 void finalize_field_class(struct bt_field_class
*fc
)
83 BT_OBJECT_PUT_REF_AND_RESET(fc
->user_attributes
);
87 void destroy_bit_array_field_class(struct bt_object
*obj
)
90 BT_LIB_LOGD("Destroying bit array field class object: %!+F", obj
);
91 finalize_field_class((void *) obj
);
95 struct bt_field_class
*bt_field_class_bit_array_create(
96 struct bt_trace_class
*trace_class
, uint64_t length
)
98 struct bt_field_class_bit_array
*ba_fc
= NULL
;
100 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
101 BT_ASSERT_PRE(length
> 0 && length
<= 64,
102 "Unsupported length for bit array field class "
103 "(minimum is 1, maximum is 64): length=%" PRIu64
, length
);
104 BT_LOGD("Creating default bit array field class object.");
105 ba_fc
= g_new0(struct bt_field_class_bit_array
, 1);
107 BT_LIB_LOGE_APPEND_CAUSE(
108 "Failed to allocate one bit array field class.");
112 if (init_field_class((void *) ba_fc
, BT_FIELD_CLASS_TYPE_BIT_ARRAY
,
113 destroy_bit_array_field_class
)) {
117 ba_fc
->length
= length
;
118 BT_LIB_LOGD("Created bit array field class object: %!+F", ba_fc
);
122 BT_OBJECT_PUT_REF_AND_RESET(ba_fc
);
125 return (void *) ba_fc
;
128 uint64_t bt_field_class_bit_array_get_length(const struct bt_field_class
*fc
)
130 const struct bt_field_class_bit_array
*ba_fc
= (const void *) fc
;
132 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
133 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_BIT_ARRAY
,
135 return ba_fc
->length
;
139 void destroy_bool_field_class(struct bt_object
*obj
)
142 BT_LIB_LOGD("Destroying boolean field class object: %!+F", obj
);
143 finalize_field_class((void *) obj
);
147 struct bt_field_class
*bt_field_class_bool_create(
148 bt_trace_class
*trace_class
)
150 struct bt_field_class_bool
*bool_fc
= NULL
;
152 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
153 BT_LOGD("Creating default boolean field class object.");
154 bool_fc
= g_new0(struct bt_field_class_bool
, 1);
156 BT_LIB_LOGE_APPEND_CAUSE(
157 "Failed to allocate one boolean field class.");
161 if (init_field_class((void *) bool_fc
, BT_FIELD_CLASS_TYPE_BOOL
,
162 destroy_bool_field_class
)) {
166 BT_LIB_LOGD("Created boolean field class object: %!+F", bool_fc
);
170 BT_OBJECT_PUT_REF_AND_RESET(bool_fc
);
173 return (void *) bool_fc
;
177 int init_integer_field_class(struct bt_field_class_integer
*fc
,
178 enum bt_field_class_type type
,
179 bt_object_release_func release_func
)
183 ret
= init_field_class((void *) fc
, type
, release_func
);
189 fc
->base
= BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL
;
196 void destroy_integer_field_class(struct bt_object
*obj
)
199 BT_LIB_LOGD("Destroying integer field class object: %!+F", obj
);
200 finalize_field_class((void *) obj
);
205 struct bt_field_class
*create_integer_field_class(bt_trace_class
*trace_class
,
206 enum bt_field_class_type type
)
208 struct bt_field_class_integer
*int_fc
= NULL
;
210 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
211 BT_LOGD("Creating default integer field class object: type=%s",
212 bt_common_field_class_type_string(type
));
213 int_fc
= g_new0(struct bt_field_class_integer
, 1);
215 BT_LIB_LOGE_APPEND_CAUSE(
216 "Failed to allocate one integer field class.");
220 if (init_integer_field_class(int_fc
, type
,
221 destroy_integer_field_class
)) {
225 BT_LIB_LOGD("Created integer field class object: %!+F", int_fc
);
229 BT_OBJECT_PUT_REF_AND_RESET(int_fc
);
232 return (void *) int_fc
;
235 struct bt_field_class
*bt_field_class_integer_unsigned_create(
236 bt_trace_class
*trace_class
)
238 return create_integer_field_class(trace_class
,
239 BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER
);
242 struct bt_field_class
*bt_field_class_integer_signed_create(
243 bt_trace_class
*trace_class
)
245 return create_integer_field_class(trace_class
,
246 BT_FIELD_CLASS_TYPE_SIGNED_INTEGER
);
249 uint64_t bt_field_class_integer_get_field_value_range(
250 const struct bt_field_class
*fc
)
252 const struct bt_field_class_integer
*int_fc
= (const void *) fc
;
254 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
255 BT_ASSERT_PRE_DEV_FC_IS_INT(fc
, "Field class");
256 return int_fc
->range
;
260 bool size_is_valid_for_enumeration_field_class(struct bt_field_class
*fc
,
267 void bt_field_class_integer_set_field_value_range(
268 struct bt_field_class
*fc
, uint64_t size
)
270 struct bt_field_class_integer
*int_fc
= (void *) fc
;
272 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
273 BT_ASSERT_PRE_FC_IS_INT(fc
, "Field class");
274 BT_ASSERT_PRE_DEV_FC_HOT(fc
, "Field class");
275 BT_ASSERT_PRE(size
<= 64,
276 "Unsupported size for integer field class's field value range "
277 "(maximum is 64): size=%" PRIu64
, size
);
279 int_fc
->common
.type
== BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER
||
280 int_fc
->common
.type
== BT_FIELD_CLASS_TYPE_SIGNED_INTEGER
||
281 size_is_valid_for_enumeration_field_class(fc
, size
),
282 "Invalid field value range for enumeration field class: "
283 "at least one of the current mapping ranges contains values "
284 "which are outside this range: %!+F, size=%" PRIu64
, fc
, size
);
285 int_fc
->range
= size
;
286 BT_LIB_LOGD("Set integer field class's field value range: %!+F", fc
);
289 enum bt_field_class_integer_preferred_display_base
290 bt_field_class_integer_get_preferred_display_base(const struct bt_field_class
*fc
)
292 const struct bt_field_class_integer
*int_fc
= (const void *) fc
;
294 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
295 BT_ASSERT_PRE_DEV_FC_IS_INT(fc
, "Field class");
299 void bt_field_class_integer_set_preferred_display_base(
300 struct bt_field_class
*fc
,
301 enum bt_field_class_integer_preferred_display_base base
)
303 struct bt_field_class_integer
*int_fc
= (void *) fc
;
305 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
306 BT_ASSERT_PRE_FC_IS_INT(fc
, "Field class");
307 BT_ASSERT_PRE_DEV_FC_HOT(fc
, "Field class");
309 BT_LIB_LOGD("Set integer field class's preferred display base: %!+F", fc
);
313 void finalize_enumeration_field_class_mapping(
314 struct bt_field_class_enumeration_mapping
*mapping
)
318 if (mapping
->label
) {
319 g_string_free(mapping
->label
, TRUE
);
320 mapping
->label
= NULL
;
323 BT_OBJECT_PUT_REF_AND_RESET(mapping
->range_set
);
327 void destroy_enumeration_field_class(struct bt_object
*obj
)
329 struct bt_field_class_enumeration
*fc
= (void *) obj
;
332 BT_LIB_LOGD("Destroying enumeration field class object: %!+F", fc
);
333 finalize_field_class((void *) obj
);
338 for (i
= 0; i
< fc
->mappings
->len
; i
++) {
339 finalize_enumeration_field_class_mapping(
340 BT_FIELD_CLASS_ENUM_MAPPING_AT_INDEX(fc
, i
));
343 g_array_free(fc
->mappings
, TRUE
);
348 g_ptr_array_free(fc
->label_buf
, TRUE
);
349 fc
->label_buf
= NULL
;
356 struct bt_field_class
*create_enumeration_field_class(
357 bt_trace_class
*trace_class
, enum bt_field_class_type type
)
359 struct bt_field_class_enumeration
*enum_fc
= NULL
;
361 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
362 BT_LOGD("Creating default enumeration field class object: type=%s",
363 bt_common_field_class_type_string(type
));
364 enum_fc
= g_new0(struct bt_field_class_enumeration
, 1);
366 BT_LIB_LOGE_APPEND_CAUSE(
367 "Failed to allocate one enumeration field class.");
371 if (init_integer_field_class((void *) enum_fc
, type
,
372 destroy_enumeration_field_class
)) {
376 enum_fc
->mappings
= g_array_new(FALSE
, TRUE
,
377 sizeof(struct bt_field_class_enumeration_mapping
));
378 if (!enum_fc
->mappings
) {
379 BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate a GArray.");
383 enum_fc
->label_buf
= g_ptr_array_new();
384 if (!enum_fc
->label_buf
) {
385 BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate a GArray.");
389 BT_LIB_LOGD("Created enumeration field class object: %!+F", enum_fc
);
393 BT_OBJECT_PUT_REF_AND_RESET(enum_fc
);
396 return (void *) enum_fc
;
399 struct bt_field_class
*bt_field_class_enumeration_unsigned_create(
400 bt_trace_class
*trace_class
)
402 return create_enumeration_field_class(trace_class
,
403 BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
);
406 struct bt_field_class
*bt_field_class_enumeration_signed_create(
407 bt_trace_class
*trace_class
)
409 return create_enumeration_field_class(trace_class
,
410 BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION
);
413 uint64_t bt_field_class_enumeration_get_mapping_count(
414 const struct bt_field_class
*fc
)
416 const struct bt_field_class_enumeration
*enum_fc
= (const void *) fc
;
418 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
419 BT_ASSERT_PRE_DEV_FC_IS_ENUM(fc
, "Field class");
420 return (uint64_t) enum_fc
->mappings
->len
;
423 const struct bt_field_class_enumeration_unsigned_mapping
*
424 bt_field_class_enumeration_unsigned_borrow_mapping_by_index_const(
425 const struct bt_field_class
*fc
, uint64_t index
)
427 const struct bt_field_class_enumeration
*enum_fc
= (const void *) fc
;
429 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
430 BT_ASSERT_PRE_DEV_VALID_INDEX(index
, enum_fc
->mappings
->len
);
431 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
,
433 return (const void *) BT_FIELD_CLASS_ENUM_MAPPING_AT_INDEX(fc
, index
);
436 const struct bt_field_class_enumeration_signed_mapping
*
437 bt_field_class_enumeration_signed_borrow_mapping_by_index_const(
438 const struct bt_field_class
*fc
, uint64_t index
)
440 const struct bt_field_class_enumeration
*enum_fc
= (const void *) fc
;
442 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
443 BT_ASSERT_PRE_DEV_VALID_INDEX(index
, enum_fc
->mappings
->len
);
444 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION
,
446 return (const void *) BT_FIELD_CLASS_ENUM_MAPPING_AT_INDEX(fc
, index
);
450 const struct bt_field_class_enumeration_mapping
*
451 borrow_enumeration_field_class_mapping_by_label(
452 const struct bt_field_class_enumeration
*fc
, const char *label
)
454 struct bt_field_class_enumeration_mapping
*mapping
= NULL
;
458 BT_ASSERT_PRE_DEV_NON_NULL(label
, "Label");
460 for (i
= 0; i
< fc
->mappings
->len
; i
++) {
461 struct bt_field_class_enumeration_mapping
*this_mapping
=
462 BT_FIELD_CLASS_ENUM_MAPPING_AT_INDEX(fc
, i
);
464 if (strcmp(this_mapping
->label
->str
, label
) == 0) {
465 mapping
= this_mapping
;
474 const struct bt_field_class_enumeration_signed_mapping
*
475 bt_field_class_enumeration_signed_borrow_mapping_by_label_const(
476 const struct bt_field_class
*fc
, const char *label
)
478 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
479 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION
,
481 return (const void *) borrow_enumeration_field_class_mapping_by_label(
482 (const void *) fc
, label
);
485 const struct bt_field_class_enumeration_unsigned_mapping
*
486 bt_field_class_enumeration_unsigned_borrow_mapping_by_label_const(
487 const struct bt_field_class
*fc
, const char *label
)
489 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
490 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
,
491 BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
, "Field class");
492 return (const void *) borrow_enumeration_field_class_mapping_by_label(
493 (const void *) fc
, label
);
496 const char *bt_field_class_enumeration_mapping_get_label(
497 const struct bt_field_class_enumeration_mapping
*mapping
)
499 BT_ASSERT_PRE_DEV_NON_NULL(mapping
, "Enumeration field class mapping");
500 return mapping
->label
->str
;
503 const struct bt_integer_range_set_unsigned
*
504 bt_field_class_enumeration_unsigned_mapping_borrow_ranges_const(
505 const struct bt_field_class_enumeration_unsigned_mapping
*u_mapping
)
507 const struct bt_field_class_enumeration_mapping
*mapping
=
508 (const void *) u_mapping
;
510 BT_ASSERT_PRE_DEV_NON_NULL(mapping
, "Enumeration field class mapping");
511 return (const void *) mapping
->range_set
;
514 const struct bt_integer_range_set_signed
*
515 bt_field_class_enumeration_signed_mapping_borrow_ranges_const(
516 const struct bt_field_class_enumeration_signed_mapping
*s_mapping
)
518 const struct bt_field_class_enumeration_mapping
*mapping
=
519 (const void *) s_mapping
;
521 BT_ASSERT_PRE_DEV_NON_NULL(mapping
, "Enumeration field class mapping");
522 return (const void *) mapping
->range_set
;
525 enum bt_field_class_enumeration_get_mapping_labels_for_value_status
526 bt_field_class_enumeration_unsigned_get_mapping_labels_for_value(
527 const struct bt_field_class
*fc
, uint64_t value
,
528 bt_field_class_enumeration_mapping_label_array
*label_array
,
531 const struct bt_field_class_enumeration
*enum_fc
= (const void *) fc
;
534 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
535 BT_ASSERT_PRE_DEV_NON_NULL(label_array
, "Label array (output)");
536 BT_ASSERT_PRE_DEV_NON_NULL(count
, "Count (output)");
537 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
,
539 g_ptr_array_set_size(enum_fc
->label_buf
, 0);
541 for (i
= 0; i
< enum_fc
->mappings
->len
; i
++) {
543 const struct bt_field_class_enumeration_mapping
*mapping
=
544 BT_FIELD_CLASS_ENUM_MAPPING_AT_INDEX(enum_fc
, i
);
546 for (j
= 0; j
< mapping
->range_set
->ranges
->len
; j
++) {
547 const struct bt_integer_range
*range
= (const void *)
548 BT_INTEGER_RANGE_SET_RANGE_AT_INDEX(
549 mapping
->range_set
, j
);
551 if (value
>= range
->lower
.u
&&
552 value
<= range
->upper
.u
) {
553 g_ptr_array_add(enum_fc
->label_buf
,
554 mapping
->label
->str
);
560 *label_array
= (void *) enum_fc
->label_buf
->pdata
;
561 *count
= (uint64_t) enum_fc
->label_buf
->len
;
562 return BT_FUNC_STATUS_OK
;
565 enum bt_field_class_enumeration_get_mapping_labels_for_value_status
566 bt_field_class_enumeration_signed_get_mapping_labels_for_value(
567 const struct bt_field_class
*fc
, int64_t value
,
568 bt_field_class_enumeration_mapping_label_array
*label_array
,
571 const struct bt_field_class_enumeration
*enum_fc
= (const void *) fc
;
574 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
575 BT_ASSERT_PRE_DEV_NON_NULL(label_array
, "Label array (output)");
576 BT_ASSERT_PRE_DEV_NON_NULL(count
, "Count (output)");
577 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION
,
579 g_ptr_array_set_size(enum_fc
->label_buf
, 0);
581 for (i
= 0; i
< enum_fc
->mappings
->len
; i
++) {
583 const struct bt_field_class_enumeration_mapping
*mapping
=
584 BT_FIELD_CLASS_ENUM_MAPPING_AT_INDEX(enum_fc
, i
);
586 for (j
= 0; j
< mapping
->range_set
->ranges
->len
; j
++) {
587 const struct bt_integer_range
*range
= (const void *)
588 BT_INTEGER_RANGE_SET_RANGE_AT_INDEX(
589 mapping
->range_set
, j
);
591 if (value
>= range
->lower
.i
&&
592 value
<= range
->upper
.i
) {
593 g_ptr_array_add(enum_fc
->label_buf
,
594 mapping
->label
->str
);
600 *label_array
= (void *) enum_fc
->label_buf
->pdata
;
601 *count
= (uint64_t) enum_fc
->label_buf
->len
;
602 return BT_FUNC_STATUS_OK
;
606 bool enumeration_field_class_has_mapping_with_label(
607 const struct bt_field_class_enumeration
*enum_fc
,
616 for (i
= 0; i
< enum_fc
->mappings
->len
; i
++) {
617 struct bt_field_class_enumeration_mapping
*mapping_candidate
=
618 BT_FIELD_CLASS_ENUM_MAPPING_AT_INDEX(enum_fc
, i
);
620 if (strcmp(mapping_candidate
->label
->str
, label
) == 0) {
631 enum bt_field_class_enumeration_add_mapping_status
632 add_mapping_to_enumeration_field_class(struct bt_field_class
*fc
,
633 const char *label
, const struct bt_integer_range_set
*range_set
)
635 enum bt_field_class_enumeration_add_mapping_status status
=
637 struct bt_field_class_enumeration
*enum_fc
= (void *) fc
;
638 struct bt_field_class_enumeration_mapping mapping
= { 0 };
641 BT_ASSERT_PRE_NON_NULL(label
, "Label");
642 BT_ASSERT_PRE_NON_NULL(range_set
, "Integer range set");
643 BT_ASSERT_PRE(!enumeration_field_class_has_mapping_with_label(
645 "Duplicate mapping name in enumeration field class: "
646 "%![enum-fc-]+F, label=\"%s\"", fc
, label
);
647 mapping
.range_set
= range_set
;
648 bt_object_get_ref(mapping
.range_set
);
649 mapping
.label
= g_string_new(label
);
650 if (!mapping
.label
) {
651 finalize_enumeration_field_class_mapping(&mapping
);
652 status
= BT_FUNC_STATUS_MEMORY_ERROR
;
656 g_array_append_val(enum_fc
->mappings
, mapping
);
657 BT_LIB_LOGD("Added mapping to enumeration field class: "
658 "%![fc-]+F, label=\"%s\"", fc
, label
);
664 enum bt_field_class_enumeration_add_mapping_status
665 bt_field_class_enumeration_unsigned_add_mapping(
666 struct bt_field_class
*fc
, const char *label
,
667 const struct bt_integer_range_set_unsigned
*range_set
)
669 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
670 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
,
672 return add_mapping_to_enumeration_field_class(fc
, label
,
673 (const void *) range_set
);
676 enum bt_field_class_enumeration_add_mapping_status
677 bt_field_class_enumeration_signed_add_mapping(
678 struct bt_field_class
*fc
, const char *label
,
679 const struct bt_integer_range_set_signed
*range_set
)
681 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
682 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION
,
684 return add_mapping_to_enumeration_field_class(fc
, label
,
685 (const void *) range_set
);
689 void destroy_real_field_class(struct bt_object
*obj
)
692 BT_LIB_LOGD("Destroying real field class object: %!+F", obj
);
693 finalize_field_class((void *) obj
);
698 struct bt_field_class
*create_real_field_class(bt_trace_class
*trace_class
,
699 enum bt_field_class_type type
)
701 struct bt_field_class_real
*real_fc
= NULL
;
703 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
704 BT_LOGD("Creating default real field class object: type=%s",
705 bt_common_field_class_type_string(type
));
706 real_fc
= g_new0(struct bt_field_class_real
, 1);
708 BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one real field class.");
712 if (init_field_class((void *) real_fc
, type
, destroy_real_field_class
)) {
716 BT_LIB_LOGD("Created real field class object: %!+F", real_fc
);
720 BT_OBJECT_PUT_REF_AND_RESET(real_fc
);
723 return (void *) real_fc
;
726 struct bt_field_class
*bt_field_class_real_single_precision_create(
727 bt_trace_class
*trace_class
)
729 return create_real_field_class(trace_class
,
730 BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL
);
733 struct bt_field_class
*bt_field_class_real_double_precision_create(
734 bt_trace_class
*trace_class
)
736 return create_real_field_class(trace_class
,
737 BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL
);
741 int init_named_field_classes_container(
742 struct bt_field_class_named_field_class_container
*fc
,
743 enum bt_field_class_type type
,
744 bt_object_release_func fc_release_func
,
745 GDestroyNotify named_fc_destroy_func
)
749 ret
= init_field_class((void *) fc
, type
, fc_release_func
);
754 fc
->named_fcs
= g_ptr_array_new_with_free_func(named_fc_destroy_func
);
755 if (!fc
->named_fcs
) {
756 BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate a GPtrArray.");
761 fc
->name_to_index
= g_hash_table_new(g_str_hash
, g_str_equal
);
762 if (!fc
->name_to_index
) {
763 BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate a GHashTable.");
773 void finalize_named_field_class(struct bt_named_field_class
*named_fc
)
776 BT_LIB_LOGD("Finalizing named field class: "
777 "addr=%p, name=\"%s\", %![fc-]+F",
778 named_fc
, named_fc
->name
? named_fc
->name
->str
: NULL
,
780 BT_OBJECT_PUT_REF_AND_RESET(named_fc
->user_attributes
);
782 if (named_fc
->name
) {
783 g_string_free(named_fc
->name
, TRUE
);
784 named_fc
->name
= NULL
;
787 BT_LOGD_STR("Putting named field class's field class.");
788 BT_OBJECT_PUT_REF_AND_RESET(named_fc
->fc
);
792 void destroy_named_field_class(gpointer ptr
)
794 struct bt_named_field_class
*named_fc
= ptr
;
797 BT_OBJECT_PUT_REF_AND_RESET(named_fc
->user_attributes
);
798 finalize_named_field_class(ptr
);
804 void destroy_variant_with_selector_option(gpointer ptr
)
806 struct bt_field_class_variant_with_selector_option
*opt
= ptr
;
809 finalize_named_field_class(&opt
->common
);
810 BT_OBJECT_PUT_REF_AND_RESET(opt
->range_set
);
816 void finalize_named_field_classes_container(
817 struct bt_field_class_named_field_class_container
*fc
)
822 g_ptr_array_free(fc
->named_fcs
, TRUE
);
823 fc
->named_fcs
= NULL
;
827 if (fc
->name_to_index
) {
828 g_hash_table_destroy(fc
->name_to_index
);
829 fc
->name_to_index
= NULL
;
834 void destroy_structure_field_class(struct bt_object
*obj
)
837 BT_LIB_LOGD("Destroying structure field class object: %!+F", obj
);
838 finalize_field_class((void *) obj
);
839 finalize_named_field_classes_container((void *) obj
);
843 struct bt_field_class
*bt_field_class_structure_create(
844 bt_trace_class
*trace_class
)
847 struct bt_field_class_structure
*struct_fc
= NULL
;
849 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
850 BT_LOGD_STR("Creating default structure field class object.");
851 struct_fc
= g_new0(struct bt_field_class_structure
, 1);
853 BT_LIB_LOGE_APPEND_CAUSE(
854 "Failed to allocate one structure field class.");
858 ret
= init_named_field_classes_container((void *) struct_fc
,
859 BT_FIELD_CLASS_TYPE_STRUCTURE
, destroy_structure_field_class
,
860 destroy_named_field_class
);
862 /* init_named_field_classes_container() logs errors */
866 BT_LIB_LOGD("Created structure field class object: %!+F", struct_fc
);
870 BT_OBJECT_PUT_REF_AND_RESET(struct_fc
);
873 return (void *) struct_fc
;
877 int init_named_field_class(struct bt_named_field_class
*named_fc
,
878 const char *name
, struct bt_field_class
*fc
)
880 int status
= BT_FUNC_STATUS_OK
;
885 named_fc
->name
= g_string_new(name
);
886 if (!named_fc
->name
) {
887 BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate a GString.");
888 status
= BT_FUNC_STATUS_MEMORY_ERROR
;
892 named_fc
->user_attributes
= bt_value_map_create();
893 if (!named_fc
->user_attributes
) {
894 BT_LIB_LOGE_APPEND_CAUSE(
895 "Failed to create a map value object.");
896 status
= BT_FUNC_STATUS_MEMORY_ERROR
;
901 bt_object_get_ref_no_null_check(named_fc
->fc
);
908 struct bt_named_field_class
*create_named_field_class(const char *name
,
909 struct bt_field_class
*fc
)
911 struct bt_named_field_class
*named_fc
= g_new0(
912 struct bt_named_field_class
, 1);
915 BT_LIB_LOGE_APPEND_CAUSE(
916 "Failed to allocate a named field class.");
920 if (init_named_field_class(named_fc
, name
, fc
)) {
921 /* init_named_field_class() logs errors */
928 destroy_named_field_class(named_fc
);
936 struct bt_field_class_variant_with_selector_option
*
937 create_variant_with_selector_option(
938 const char *name
, struct bt_field_class
*fc
,
939 const struct bt_integer_range_set
*range_set
)
941 struct bt_field_class_variant_with_selector_option
*opt
= g_new0(
942 struct bt_field_class_variant_with_selector_option
, 1);
944 BT_ASSERT(range_set
);
947 BT_LIB_LOGE_APPEND_CAUSE(
948 "Failed to allocate a named field class.");
952 if (init_named_field_class(&opt
->common
, name
, fc
)) {
956 opt
->range_set
= range_set
;
957 bt_object_get_ref_no_null_check(opt
->range_set
);
958 bt_integer_range_set_freeze(range_set
);
962 destroy_variant_with_selector_option(opt
);
970 int append_named_field_class_to_container_field_class(
971 struct bt_field_class_named_field_class_container
*container_fc
,
972 struct bt_named_field_class
*named_fc
)
974 BT_ASSERT(container_fc
);
976 BT_ASSERT_PRE_DEV_FC_HOT(container_fc
, "Field class");
977 BT_ASSERT_PRE(!bt_g_hash_table_contains(container_fc
->name_to_index
,
978 named_fc
->name
->str
),
979 "Duplicate member/option name in structure/variant field class: "
980 "%![container-fc-]+F, name=\"%s\"", container_fc
,
981 named_fc
->name
->str
);
984 * Freeze the contained field class, but not the named field
985 * class itself, as it's still possible afterwards to modify
986 * properties of the member/option object.
988 bt_field_class_freeze(named_fc
->fc
);
989 g_ptr_array_add(container_fc
->named_fcs
, named_fc
);
990 g_hash_table_insert(container_fc
->name_to_index
, named_fc
->name
->str
,
991 GUINT_TO_POINTER(container_fc
->named_fcs
->len
- 1));
992 return BT_FUNC_STATUS_OK
;
995 enum bt_field_class_structure_append_member_status
996 bt_field_class_structure_append_member(
997 struct bt_field_class
*fc
, const char *name
,
998 struct bt_field_class
*member_fc
)
1000 enum bt_field_class_structure_append_member_status status
;
1001 struct bt_named_field_class
*named_fc
= NULL
;
1003 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1004 BT_ASSERT_PRE_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_STRUCTURE
,
1006 named_fc
= create_named_field_class(name
, member_fc
);
1008 /* create_named_field_class() logs errors */
1009 status
= BT_FUNC_STATUS_MEMORY_ERROR
;
1013 status
= append_named_field_class_to_container_field_class((void *) fc
,
1015 if (status
== BT_FUNC_STATUS_OK
) {
1016 /* Moved to the container */
1024 uint64_t bt_field_class_structure_get_member_count(
1025 const struct bt_field_class
*fc
)
1027 struct bt_field_class_structure
*struct_fc
= (void *) fc
;
1029 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1030 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_STRUCTURE
,
1032 return (uint64_t) struct_fc
->common
.named_fcs
->len
;
1036 struct bt_named_field_class
*
1037 borrow_named_field_class_from_container_field_class_at_index(
1038 struct bt_field_class_named_field_class_container
*fc
,
1042 BT_ASSERT_PRE_DEV_VALID_INDEX(index
, fc
->named_fcs
->len
);
1043 return fc
->named_fcs
->pdata
[index
];
1046 const struct bt_field_class_structure_member
*
1047 bt_field_class_structure_borrow_member_by_index_const(
1048 const struct bt_field_class
*fc
, uint64_t index
)
1050 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1051 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_STRUCTURE
,
1053 return (const void *)
1054 borrow_named_field_class_from_container_field_class_at_index(
1055 (void *) fc
, index
);
1058 struct bt_field_class_structure_member
*
1059 bt_field_class_structure_borrow_member_by_index(
1060 struct bt_field_class
*fc
, uint64_t index
)
1062 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1063 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_STRUCTURE
,
1066 borrow_named_field_class_from_container_field_class_at_index(
1067 (void *) fc
, index
);
1071 struct bt_named_field_class
*
1072 borrow_named_field_class_from_container_field_class_by_name(
1073 struct bt_field_class_named_field_class_container
*fc
,
1076 struct bt_named_field_class
*named_fc
= NULL
;
1081 BT_ASSERT_PRE_DEV_NON_NULL(name
, "Name");
1082 if (!g_hash_table_lookup_extended(fc
->name_to_index
, name
, &orig_key
,
1087 named_fc
= fc
->named_fcs
->pdata
[GPOINTER_TO_UINT(value
)];
1093 const struct bt_field_class_structure_member
*
1094 bt_field_class_structure_borrow_member_by_name_const(
1095 const struct bt_field_class
*fc
, const char *name
)
1097 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1098 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_STRUCTURE
,
1100 return (const void *)
1101 borrow_named_field_class_from_container_field_class_by_name(
1105 struct bt_field_class_structure_member
*
1106 bt_field_class_structure_borrow_member_by_name(
1107 struct bt_field_class
*fc
, const char *name
)
1109 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1110 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_STRUCTURE
,
1113 borrow_named_field_class_from_container_field_class_by_name(
1117 const char *bt_field_class_structure_member_get_name(
1118 const struct bt_field_class_structure_member
*member
)
1120 const struct bt_named_field_class
*named_fc
= (const void *) member
;
1122 BT_ASSERT_PRE_DEV_NON_NULL(member
, "Structure field class member");
1123 return named_fc
->name
->str
;
1126 const struct bt_field_class
*
1127 bt_field_class_structure_member_borrow_field_class_const(
1128 const struct bt_field_class_structure_member
*member
)
1130 const struct bt_named_field_class
*named_fc
= (const void *) member
;
1132 BT_ASSERT_PRE_DEV_NON_NULL(member
, "Structure field class member");
1133 return named_fc
->fc
;
1136 struct bt_field_class
*
1137 bt_field_class_structure_member_borrow_field_class(
1138 struct bt_field_class_structure_member
*member
)
1140 struct bt_named_field_class
*named_fc
= (void *) member
;
1142 BT_ASSERT_PRE_DEV_NON_NULL(member
, "Structure field class member");
1143 return named_fc
->fc
;
1147 void destroy_option_field_class(struct bt_object
*obj
)
1149 struct bt_field_class_option
*fc
= (void *) obj
;
1152 BT_LIB_LOGD("Destroying option field class object: %!+F", fc
);
1153 finalize_field_class((void *) obj
);
1154 BT_LOGD_STR("Putting content field class.");
1155 BT_OBJECT_PUT_REF_AND_RESET(fc
->content_fc
);
1157 if (fc
->common
.type
!= BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR
) {
1158 struct bt_field_class_option_with_selector
*with_sel_fc
=
1161 BT_LOGD_STR("Putting selector field path.");
1162 BT_OBJECT_PUT_REF_AND_RESET(with_sel_fc
->selector_field_path
);
1163 BT_LOGD_STR("Putting selector field class.");
1164 BT_OBJECT_PUT_REF_AND_RESET(with_sel_fc
->selector_fc
);
1166 if (fc
->common
.type
!= BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR
) {
1167 struct bt_field_class_option_with_selector_integer
*with_int_sel_fc
=
1170 BT_LOGD_STR("Putting integer range set.");
1171 BT_OBJECT_PUT_REF_AND_RESET(with_int_sel_fc
->range_set
);
1179 struct bt_field_class
*create_option_field_class(
1180 struct bt_trace_class
*trace_class
,
1181 enum bt_field_class_type fc_type
,
1182 struct bt_field_class
*content_fc
,
1183 struct bt_field_class
*selector_fc
)
1185 struct bt_field_class_option
*opt_fc
= NULL
;
1187 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
1188 BT_ASSERT_PRE_NON_NULL(content_fc
, "Content field class");
1189 BT_LIB_LOGD("Creating option field class: "
1190 "type=%s, %![content-fc-]+F, %![sel-fc-]+F",
1191 bt_common_field_class_type_string(fc_type
),
1192 content_fc
, selector_fc
);
1194 if (fc_type
!= BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR
) {
1195 struct bt_field_class_option_with_selector
*opt_with_sel_fc
= NULL
;
1197 BT_ASSERT_PRE_NON_NULL(selector_fc
, "Selector field class");
1199 if (fc_type
== BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR
) {
1200 BT_ASSERT_PRE_FC_HAS_ID(selector_fc
,
1201 BT_FIELD_CLASS_TYPE_BOOL
,
1202 "Selector field class");
1203 opt_with_sel_fc
= (void *) g_new0(
1204 struct bt_field_class_option_with_selector_bool
, 1);
1206 BT_ASSERT_PRE_FC_IS_INT(selector_fc
,
1207 "Selector field class");
1208 opt_with_sel_fc
= (void *) g_new0(
1209 struct bt_field_class_option_with_selector_integer
, 1);
1212 if (!opt_with_sel_fc
) {
1213 BT_LIB_LOGE_APPEND_CAUSE(
1214 "Failed to allocate one option with selector field class.");
1218 opt_with_sel_fc
->selector_fc
= selector_fc
;
1219 bt_object_get_ref_no_null_check(opt_with_sel_fc
->selector_fc
);
1220 opt_fc
= (void *) opt_with_sel_fc
;
1222 opt_fc
= g_new0(struct bt_field_class_option
, 1);
1224 BT_LIB_LOGE_APPEND_CAUSE(
1225 "Failed to allocate one option field class.");
1232 if (init_field_class((void *) opt_fc
, fc_type
,
1233 destroy_option_field_class
)) {
1237 opt_fc
->content_fc
= content_fc
;
1238 bt_object_get_ref_no_null_check(opt_fc
->content_fc
);
1239 bt_field_class_freeze(opt_fc
->content_fc
);
1242 bt_field_class_freeze(selector_fc
);
1245 BT_LIB_LOGD("Created option field class object: "
1246 "%![opt-fc-]+F, %![sel-fc-]+F", opt_fc
, selector_fc
);
1250 BT_OBJECT_PUT_REF_AND_RESET(opt_fc
);
1253 return (void *) opt_fc
;
1256 struct bt_field_class
*bt_field_class_option_without_selector_create(
1257 struct bt_trace_class
*trace_class
,
1258 struct bt_field_class
*content_fc
)
1260 return create_option_field_class(trace_class
,
1261 BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR
,
1265 struct bt_field_class
*bt_field_class_option_with_selector_bool_create(
1266 struct bt_trace_class
*trace_class
,
1267 struct bt_field_class
*content_fc
,
1268 struct bt_field_class
*selector_fc
)
1270 struct bt_field_class_option_with_selector_bool
*fc
=
1271 (void *) create_option_field_class(trace_class
,
1272 BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR
,
1273 content_fc
, selector_fc
);
1283 struct bt_field_class
*
1284 bt_field_class_option_with_selector_integer_unsigned_create(
1285 struct bt_trace_class
*trace_class
,
1286 struct bt_field_class
*content_fc
,
1287 struct bt_field_class
*selector_fc
,
1288 const struct bt_integer_range_set_unsigned
*u_range_set
)
1290 struct bt_field_class_option_with_selector_integer
*fc
;
1291 const struct bt_integer_range_set
*range_set
=
1292 (const void *) u_range_set
;
1294 BT_ASSERT_PRE_NON_NULL(range_set
, "Integer range set");
1295 BT_ASSERT_PRE(range_set
->ranges
->len
> 0,
1296 "Integer range set is empty: %!+R", range_set
);
1297 fc
= (void *) create_option_field_class(trace_class
,
1298 BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR
,
1299 content_fc
, selector_fc
);
1305 fc
->range_set
= range_set
;
1306 bt_object_get_ref_no_null_check(fc
->range_set
);
1307 bt_integer_range_set_freeze(range_set
);
1313 struct bt_field_class
*
1314 bt_field_class_option_with_selector_integer_signed_create(
1315 struct bt_trace_class
*trace_class
,
1316 struct bt_field_class
*content_fc
,
1317 struct bt_field_class
*selector_fc
,
1318 const struct bt_integer_range_set_signed
*i_range_set
)
1320 struct bt_field_class_option_with_selector_integer
*fc
;
1321 const struct bt_integer_range_set
*range_set
=
1322 (const void *) i_range_set
;
1324 BT_ASSERT_PRE_NON_NULL(range_set
, "Integer range set");
1325 BT_ASSERT_PRE(range_set
->ranges
->len
> 0,
1326 "Integer range set is empty: %!+R", range_set
);
1327 fc
= (void *) create_option_field_class(trace_class
,
1328 BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR
,
1329 content_fc
, selector_fc
);
1335 fc
->range_set
= range_set
;
1336 bt_object_get_ref_no_null_check(fc
->range_set
);
1337 bt_integer_range_set_freeze(range_set
);
1343 const struct bt_field_class
*bt_field_class_option_borrow_field_class_const(
1344 const struct bt_field_class
*fc
)
1346 struct bt_field_class_option
*opt_fc
= (void *) fc
;
1348 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1349 BT_ASSERT_PRE_FC_IS_OPTION(fc
, "Field class");
1350 return opt_fc
->content_fc
;
1353 struct bt_field_class
*bt_field_class_option_borrow_field_class(
1354 struct bt_field_class
*fc
)
1356 struct bt_field_class_option
*opt_fc
= (void *) fc
;
1358 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1359 BT_ASSERT_PRE_FC_IS_OPTION(fc
, "Field class");
1360 return opt_fc
->content_fc
;
1363 const struct bt_field_path
*
1364 bt_field_class_option_with_selector_borrow_selector_field_path_const(
1365 const struct bt_field_class
*fc
)
1367 const struct bt_field_class_option_with_selector
*opt_fc
=
1370 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1371 BT_ASSERT_PRE_FC_IS_OPTION_WITH_SEL(fc
, "Field class");
1372 return opt_fc
->selector_field_path
;
1375 void bt_field_class_option_with_selector_bool_set_selector_is_reversed(
1376 struct bt_field_class
*fc
, bt_bool sel_is_reversed
)
1378 struct bt_field_class_option_with_selector_bool
*opt_fc
= (void *) fc
;
1380 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1381 BT_ASSERT_PRE_FC_HAS_ID(fc
,
1382 BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR
, "Field class");
1383 BT_ASSERT_PRE_DEV_FC_HOT(fc
, "Field class");
1384 opt_fc
->sel_is_reversed
= sel_is_reversed
;
1387 bt_bool
bt_field_class_option_with_selector_bool_selector_is_reversed(
1388 const struct bt_field_class
*fc
)
1390 struct bt_field_class_option_with_selector_bool
*opt_fc
= (void *) fc
;
1392 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1393 BT_ASSERT_PRE_FC_HAS_ID(fc
,
1394 BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR
, "Field class");
1395 return opt_fc
->sel_is_reversed
;
1398 const struct bt_integer_range_set_unsigned
*
1399 bt_field_class_option_with_selector_integer_unsigned_borrow_selector_ranges_const(
1400 const struct bt_field_class
*fc
)
1402 struct bt_field_class_option_with_selector_integer
*opt_fc
=
1405 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1406 BT_ASSERT_PRE_FC_IS_OPTION_WITH_INT_SEL(fc
, "Field class");
1407 return (const void *) opt_fc
->range_set
;
1410 const struct bt_integer_range_set_signed
*
1411 bt_field_class_option_with_selector_integer_signed_borrow_selector_ranges_const(
1412 const struct bt_field_class
*fc
)
1414 struct bt_field_class_option_with_selector_integer
*opt_fc
=
1417 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1418 BT_ASSERT_PRE_FC_IS_OPTION_WITH_INT_SEL(fc
, "Field class");
1419 return (const void *) opt_fc
->range_set
;
1423 void finalize_variant_field_class(struct bt_field_class_variant
*var_fc
)
1426 BT_LIB_LOGD("Finalizing variant field class object: %!+F", var_fc
);
1427 finalize_field_class((void *) var_fc
);
1428 finalize_named_field_classes_container((void *) var_fc
);
1432 void destroy_variant_field_class(struct bt_object
*obj
)
1434 struct bt_field_class_variant
*fc
= (void *) obj
;
1437 finalize_variant_field_class(fc
);
1442 void destroy_variant_with_selector_field_class(struct bt_object
*obj
)
1444 struct bt_field_class_variant_with_selector
*fc
= (void *) obj
;
1447 finalize_variant_field_class(&fc
->common
);
1448 BT_LOGD_STR("Putting selector field path.");
1449 BT_OBJECT_PUT_REF_AND_RESET(fc
->selector_field_path
);
1450 BT_LOGD_STR("Putting selector field class.");
1451 BT_OBJECT_PUT_REF_AND_RESET(fc
->selector_fc
);
1455 struct bt_field_class
*bt_field_class_variant_create(
1456 bt_trace_class
*trace_class
, bt_field_class
*selector_fc
)
1459 struct bt_field_class_variant
*var_fc
= NULL
;
1460 struct bt_field_class_variant_with_selector
*var_with_sel_fc
= NULL
;
1461 enum bt_field_class_type fc_type
;
1463 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
1466 BT_ASSERT_PRE_FC_IS_INT(selector_fc
, "Selector field class");
1469 BT_LIB_LOGD("Creating default variant field class: %![sel-fc-]+F",
1473 var_with_sel_fc
= g_new0(
1474 struct bt_field_class_variant_with_selector
, 1);
1475 if (!var_with_sel_fc
) {
1476 BT_LIB_LOGE_APPEND_CAUSE(
1477 "Failed to allocate one variant field class with selector.");
1481 if (selector_fc
->type
== BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER
||
1482 selector_fc
->type
== BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
) {
1483 fc_type
= BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR
;
1485 fc_type
= BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR
;
1488 ret
= init_named_field_classes_container(
1489 (void *) var_with_sel_fc
, fc_type
,
1490 destroy_variant_with_selector_field_class
,
1491 destroy_variant_with_selector_option
);
1493 /* init_named_field_classes_container() logs errors */
1497 var_with_sel_fc
->selector_fc
= selector_fc
;
1498 bt_object_get_ref_no_null_check(var_with_sel_fc
->selector_fc
);
1499 bt_field_class_freeze(selector_fc
);
1500 var_fc
= (void *) var_with_sel_fc
;
1501 BT_LIB_LOGD("Created default variant field class with selector object: "
1502 "%![var-fc-]+F, %![sel-fc-]+F", var_fc
, selector_fc
);
1504 var_fc
= g_new0(struct bt_field_class_variant
, 1);
1506 BT_LIB_LOGE_APPEND_CAUSE(
1507 "Failed to allocate one variant field class without selector.");
1511 ret
= init_named_field_classes_container((void *) var_fc
,
1512 BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR
,
1513 destroy_variant_field_class
, destroy_named_field_class
);
1515 /* init_named_field_classes_container() logs errors */
1518 BT_LIB_LOGD("Created default variant field class without selector object: "
1519 "%![var-fc-]+F", var_fc
);
1526 BT_OBJECT_PUT_REF_AND_RESET(var_fc
);
1527 BT_OBJECT_PUT_REF_AND_RESET(var_with_sel_fc
);
1530 return (void *) var_fc
;
1533 enum bt_field_class_variant_without_selector_append_option_status
1534 bt_field_class_variant_without_selector_append_option(struct bt_field_class
*fc
,
1535 const char *name
, struct bt_field_class
*option_fc
)
1537 enum bt_field_class_variant_without_selector_append_option_status status
;
1538 struct bt_named_field_class
*named_fc
= NULL
;
1540 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1541 BT_ASSERT_PRE_NON_NULL(name
, "Name");
1542 BT_ASSERT_PRE_NON_NULL(option_fc
, "Option field class");
1543 BT_ASSERT_PRE_FC_HAS_ID(fc
,
1544 BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR
, "Field class");
1545 named_fc
= create_named_field_class(name
, option_fc
);
1547 /* create_named_field_class() logs errors */
1548 status
= BT_FUNC_STATUS_MEMORY_ERROR
;
1552 status
= append_named_field_class_to_container_field_class((void *) fc
,
1554 if (status
== BT_FUNC_STATUS_OK
) {
1555 /* Moved to the container */
1561 destroy_named_field_class(named_fc
);
1568 int ranges_overlap(GPtrArray
*var_fc_opts
, const struct bt_integer_range_set
*range_set
,
1569 bool is_signed
, bool *has_overlap
)
1571 int status
= BT_FUNC_STATUS_OK
;
1572 struct bt_integer_range_set
*full_range_set
;
1575 *has_overlap
= false;
1578 * Build a single range set with all the ranges and test for
1582 full_range_set
= (void *) bt_integer_range_set_signed_create();
1584 full_range_set
= (void *) bt_integer_range_set_unsigned_create();
1587 if (!full_range_set
) {
1588 BT_LOGE_STR("Failed to create a range set.");
1589 status
= BT_FUNC_STATUS_MEMORY_ERROR
;
1593 /* Add existing option ranges */
1594 for (i
= 0; i
< var_fc_opts
->len
; i
++) {
1595 struct bt_field_class_variant_with_selector_option
*opt
=
1596 var_fc_opts
->pdata
[i
];
1599 for (j
= 0; j
< opt
->range_set
->ranges
->len
; j
++) {
1600 struct bt_integer_range
*range
= BT_INTEGER_RANGE_SET_RANGE_AT_INDEX(
1604 status
= bt_integer_range_set_signed_add_range(
1605 (void *) full_range_set
, range
->lower
.i
,
1608 status
= bt_integer_range_set_unsigned_add_range(
1609 (void *) full_range_set
, range
->lower
.u
,
1619 /* Add new ranges */
1620 for (i
= 0; i
< range_set
->ranges
->len
; i
++) {
1621 struct bt_integer_range
*range
= BT_INTEGER_RANGE_SET_RANGE_AT_INDEX(
1625 status
= bt_integer_range_set_signed_add_range(
1626 (void *) full_range_set
, range
->lower
.i
,
1629 status
= bt_integer_range_set_unsigned_add_range(
1630 (void *) full_range_set
, range
->lower
.u
,
1639 /* Check overlaps */
1641 *has_overlap
= bt_integer_range_set_signed_has_overlaps(full_range_set
);
1643 *has_overlap
= bt_integer_range_set_unsigned_has_overlaps(
1648 bt_object_put_ref(full_range_set
);
1653 int append_option_to_variant_with_selector_field_class(
1654 struct bt_field_class
*fc
, const char *name
,
1655 struct bt_field_class
*option_fc
,
1656 const struct bt_integer_range_set
*range_set
,
1657 enum bt_field_class_type expected_type
)
1660 struct bt_field_class_variant_with_selector
*var_fc
= (void *) fc
;
1661 struct bt_field_class_variant_with_selector_option
*opt
= NULL
;
1664 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
1665 BT_ASSERT_PRE_NON_NULL(name
, "Name");
1666 BT_ASSERT_PRE_NON_NULL(option_fc
, "Option field class");
1667 BT_ASSERT_PRE_NON_NULL(range_set
, "Integer range set");
1668 BT_ASSERT_PRE_FC_HAS_ID(fc
, expected_type
, "Field class");
1669 BT_ASSERT_PRE(range_set
->ranges
->len
> 0,
1670 "Integer range set is empty: %!+R", range_set
);
1671 status
= ranges_overlap(var_fc
->common
.common
.named_fcs
, range_set
,
1672 expected_type
== BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR
,
1675 /* ranges_overlap() logs errors */
1679 BT_ASSERT_PRE(!has_overlap
,
1680 "Integer range set's ranges and existing ranges have an overlap: "
1682 opt
= create_variant_with_selector_option(name
, option_fc
, range_set
);
1684 /* create_variant_with_selector_option() logs errors */
1685 status
= BT_FUNC_STATUS_MEMORY_ERROR
;
1689 status
= append_named_field_class_to_container_field_class((void *) fc
,
1691 if (status
== BT_FUNC_STATUS_OK
) {
1692 /* Moved to the container */
1698 destroy_variant_with_selector_option(opt
);
1704 enum bt_field_class_variant_with_selector_integer_append_option_status
1705 bt_field_class_variant_with_selector_integer_unsigned_append_option(
1706 struct bt_field_class
*fc
, const char *name
,
1707 struct bt_field_class
*option_fc
,
1708 const struct bt_integer_range_set_unsigned
*range_set
)
1710 return append_option_to_variant_with_selector_field_class(fc
,
1711 name
, option_fc
, (const void *) range_set
,
1712 BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR
);
1715 enum bt_field_class_variant_with_selector_integer_append_option_status
1716 bt_field_class_variant_with_selector_integer_signed_append_option(
1717 struct bt_field_class
*fc
, const char *name
,
1718 struct bt_field_class
*option_fc
,
1719 const struct bt_integer_range_set_signed
*range_set
)
1721 return append_option_to_variant_with_selector_field_class(fc
,
1722 name
, option_fc
, (const void *) range_set
,
1723 BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR
);
1726 uint64_t bt_field_class_variant_get_option_count(const struct bt_field_class
*fc
)
1728 const struct bt_field_class_variant
*var_fc
= (const void *) fc
;
1730 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1731 BT_ASSERT_PRE_DEV_FC_IS_VARIANT(fc
, "Field class");
1732 return (uint64_t) var_fc
->common
.named_fcs
->len
;
1735 const struct bt_field_class_variant_option
*
1736 bt_field_class_variant_borrow_option_by_name_const(
1737 const struct bt_field_class
*fc
, const char *name
)
1739 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1740 BT_ASSERT_PRE_DEV_FC_IS_VARIANT(fc
, "Field class");
1741 return (const void *)
1742 borrow_named_field_class_from_container_field_class_by_name(
1746 const struct bt_field_class_variant_option
*
1747 bt_field_class_variant_borrow_option_by_index_const(
1748 const struct bt_field_class
*fc
, uint64_t index
)
1750 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1751 BT_ASSERT_PRE_DEV_FC_IS_VARIANT(fc
, "Field class");
1752 return (const void *)
1753 borrow_named_field_class_from_container_field_class_at_index(
1754 (void *) fc
, index
);
1757 struct bt_field_class_variant_option
*
1758 bt_field_class_variant_borrow_option_by_name(
1759 struct bt_field_class
*fc
, const char *name
)
1761 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1762 BT_ASSERT_PRE_DEV_FC_IS_VARIANT(fc
, "Field class");
1764 borrow_named_field_class_from_container_field_class_by_name(
1768 struct bt_field_class_variant_option
*
1769 bt_field_class_variant_borrow_option_by_index(
1770 struct bt_field_class
*fc
, uint64_t index
)
1772 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1773 BT_ASSERT_PRE_DEV_FC_IS_VARIANT(fc
, "Field class");
1775 borrow_named_field_class_from_container_field_class_at_index(
1776 (void *) fc
, index
);
1779 const struct bt_field_class_variant_with_selector_integer_unsigned_option
*
1780 bt_field_class_variant_with_selector_integer_unsigned_borrow_option_by_name_const(
1781 const struct bt_field_class
*fc
, const char *name
)
1783 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1784 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
,
1785 BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR
,
1787 return (const void *)
1788 borrow_named_field_class_from_container_field_class_by_name(
1792 const struct bt_field_class_variant_with_selector_integer_unsigned_option
*
1793 bt_field_class_variant_with_selector_integer_unsigned_borrow_option_by_index_const(
1794 const struct bt_field_class
*fc
, uint64_t index
)
1796 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1797 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
,
1798 BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR
,
1800 return (const void *)
1801 borrow_named_field_class_from_container_field_class_at_index(
1802 (void *) fc
, index
);
1805 const struct bt_field_class_variant_with_selector_integer_signed_option
*
1806 bt_field_class_variant_with_selector_integer_signed_borrow_option_by_name_const(
1807 const struct bt_field_class
*fc
, const char *name
)
1809 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1810 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
,
1811 BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR
,
1813 return (const void *)
1814 borrow_named_field_class_from_container_field_class_by_name(
1818 const struct bt_field_class_variant_with_selector_integer_signed_option
*
1819 bt_field_class_variant_with_selector_integer_signed_borrow_option_by_index_const(
1820 const struct bt_field_class
*fc
, uint64_t index
)
1822 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1823 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
,
1824 BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR
,
1826 return (const void *)
1827 borrow_named_field_class_from_container_field_class_at_index(
1828 (void *) fc
, index
);
1831 const char *bt_field_class_variant_option_get_name(
1832 const struct bt_field_class_variant_option
*option
)
1834 const struct bt_named_field_class
*named_fc
= (const void *) option
;
1836 BT_ASSERT_PRE_DEV_NON_NULL(option
, "Variant field class option");
1837 return named_fc
->name
->str
;
1840 const struct bt_field_class
*
1841 bt_field_class_variant_option_borrow_field_class_const(
1842 const struct bt_field_class_variant_option
*option
)
1844 const struct bt_named_field_class
*named_fc
= (const void *) option
;
1846 BT_ASSERT_PRE_DEV_NON_NULL(option
, "Variant field class option");
1847 return named_fc
->fc
;
1850 struct bt_field_class
*
1851 bt_field_class_variant_option_borrow_field_class(
1852 struct bt_field_class_variant_option
*option
)
1854 struct bt_named_field_class
*named_fc
= (void *) option
;
1856 BT_ASSERT_PRE_DEV_NON_NULL(option
, "Variant field class option");
1857 return named_fc
->fc
;
1860 const struct bt_integer_range_set_unsigned
*
1861 bt_field_class_variant_with_selector_integer_unsigned_option_borrow_ranges_const(
1862 const struct bt_field_class_variant_with_selector_integer_unsigned_option
*option
)
1864 const struct bt_field_class_variant_with_selector_option
*opt
=
1865 (const void *) option
;
1867 BT_ASSERT_PRE_DEV_NON_NULL(option
, "Variant field class option");
1868 return (const void *) opt
->range_set
;
1871 const struct bt_integer_range_set_signed
*
1872 bt_field_class_variant_with_selector_integer_signed_option_borrow_ranges_const(
1873 const struct bt_field_class_variant_with_selector_integer_signed_option
*option
)
1875 const struct bt_field_class_variant_with_selector_option
*opt
=
1876 (const void *) option
;
1878 BT_ASSERT_PRE_DEV_NON_NULL(option
, "Variant field class option");
1879 return (const void *) opt
->range_set
;
1882 const struct bt_field_path
*
1883 bt_field_class_variant_with_selector_borrow_selector_field_path_const(
1884 const struct bt_field_class
*fc
)
1886 const struct bt_field_class_variant_with_selector
*var_fc
=
1889 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1890 BT_ASSERT_PRE_DEV_FC_IS_VARIANT_WITH_SEL(fc
, "Field class");
1891 return var_fc
->selector_field_path
;
1895 int init_array_field_class(struct bt_field_class_array
*fc
,
1896 enum bt_field_class_type type
, bt_object_release_func release_func
,
1897 struct bt_field_class
*element_fc
)
1901 BT_ASSERT(element_fc
);
1902 ret
= init_field_class((void *) fc
, type
, release_func
);
1907 fc
->element_fc
= element_fc
;
1908 bt_object_get_ref_no_null_check(fc
->element_fc
);
1909 bt_field_class_freeze(element_fc
);
1916 void finalize_array_field_class(struct bt_field_class_array
*array_fc
)
1918 BT_ASSERT(array_fc
);
1919 BT_LOGD_STR("Putting element field class.");
1920 finalize_field_class((void *) array_fc
);
1921 BT_OBJECT_PUT_REF_AND_RESET(array_fc
->element_fc
);
1925 void destroy_static_array_field_class(struct bt_object
*obj
)
1928 BT_LIB_LOGD("Destroying static array field class object: %!+F", obj
);
1929 finalize_array_field_class((void *) obj
);
1933 struct bt_field_class
*
1934 bt_field_class_array_static_create(bt_trace_class
*trace_class
,
1935 struct bt_field_class
*element_fc
, uint64_t length
)
1937 struct bt_field_class_array_static
*array_fc
= NULL
;
1939 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
1940 BT_ASSERT_PRE_NON_NULL(element_fc
, "Element field class");
1941 BT_LOGD_STR("Creating default static array field class object.");
1942 array_fc
= g_new0(struct bt_field_class_array_static
, 1);
1944 BT_LIB_LOGE_APPEND_CAUSE(
1945 "Failed to allocate one static array field class.");
1949 if (init_array_field_class((void *) array_fc
,
1950 BT_FIELD_CLASS_TYPE_STATIC_ARRAY
,
1951 destroy_static_array_field_class
, element_fc
)) {
1955 array_fc
->length
= length
;
1956 BT_LIB_LOGD("Created static array field class object: %!+F", array_fc
);
1960 BT_OBJECT_PUT_REF_AND_RESET(array_fc
);
1963 return (void *) array_fc
;
1966 const struct bt_field_class
*
1967 bt_field_class_array_borrow_element_field_class_const(
1968 const struct bt_field_class
*fc
)
1970 const struct bt_field_class_array
*array_fc
= (const void *) fc
;
1972 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1973 BT_ASSERT_PRE_DEV_FC_IS_ARRAY(fc
, "Field class");
1974 return array_fc
->element_fc
;
1977 struct bt_field_class
*
1978 bt_field_class_array_borrow_element_field_class(struct bt_field_class
*fc
)
1980 struct bt_field_class_array
*array_fc
= (void *) fc
;
1982 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1983 BT_ASSERT_PRE_DEV_FC_IS_ARRAY(fc
, "Field class");
1984 return array_fc
->element_fc
;
1987 uint64_t bt_field_class_array_static_get_length(const struct bt_field_class
*fc
)
1989 const struct bt_field_class_array_static
*array_fc
= (const void *) fc
;
1991 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
1992 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
, BT_FIELD_CLASS_TYPE_STATIC_ARRAY
,
1994 return (uint64_t) array_fc
->length
;
1998 void destroy_dynamic_array_field_class(struct bt_object
*obj
)
2000 struct bt_field_class_array_dynamic
*fc
= (void *) obj
;
2003 BT_LIB_LOGD("Destroying dynamic array field class object: %!+F", fc
);
2004 finalize_array_field_class((void *) fc
);
2005 BT_LOGD_STR("Putting length field path.");
2006 BT_OBJECT_PUT_REF_AND_RESET(fc
->length_field_path
);
2007 BT_LOGD_STR("Putting length field class.");
2008 BT_OBJECT_PUT_REF_AND_RESET(fc
->length_fc
);
2012 struct bt_field_class
*bt_field_class_array_dynamic_create(
2013 struct bt_trace_class
*trace_class
,
2014 struct bt_field_class
*element_fc
,
2015 struct bt_field_class
*length_fc
)
2017 struct bt_field_class_array_dynamic
*array_fc
= NULL
;
2019 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
2020 BT_ASSERT_PRE_NON_NULL(element_fc
, "Element field class");
2021 BT_LOGD_STR("Creating default dynamic array field class object.");
2022 array_fc
= g_new0(struct bt_field_class_array_dynamic
, 1);
2024 BT_LIB_LOGE_APPEND_CAUSE(
2025 "Failed to allocate one dynamic array field class.");
2029 if (init_array_field_class((void *) array_fc
,
2031 BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD
:
2032 BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD
,
2033 destroy_dynamic_array_field_class
, element_fc
)) {
2038 BT_ASSERT_PRE_FC_IS_UNSIGNED_INT(length_fc
,
2039 "Length field class");
2040 array_fc
->length_fc
= length_fc
;
2041 bt_object_get_ref_no_null_check(array_fc
->length_fc
);
2042 bt_field_class_freeze(length_fc
);
2045 BT_LIB_LOGD("Created dynamic array field class object: %!+F", array_fc
);
2049 BT_OBJECT_PUT_REF_AND_RESET(array_fc
);
2052 return (void *) array_fc
;
2055 const struct bt_field_path
*
2056 bt_field_class_array_dynamic_with_length_field_borrow_length_field_path_const(
2057 const struct bt_field_class
*fc
)
2059 const struct bt_field_class_array_dynamic
*seq_fc
= (const void *) fc
;
2061 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
2062 BT_ASSERT_PRE_DEV_FC_HAS_ID(fc
,
2063 BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD
,
2065 return seq_fc
->length_field_path
;
2069 void destroy_string_field_class(struct bt_object
*obj
)
2072 BT_LIB_LOGD("Destroying string field class object: %!+F", obj
);
2073 finalize_field_class((void *) obj
);
2077 struct bt_field_class
*bt_field_class_string_create(bt_trace_class
*trace_class
)
2079 struct bt_field_class_string
*string_fc
= NULL
;
2081 BT_ASSERT_PRE_NON_NULL(trace_class
, "Trace class");
2082 BT_LOGD_STR("Creating default string field class object.");
2083 string_fc
= g_new0(struct bt_field_class_string
, 1);
2085 BT_LIB_LOGE_APPEND_CAUSE(
2086 "Failed to allocate one string field class.");
2090 if (init_field_class((void *) string_fc
, BT_FIELD_CLASS_TYPE_STRING
,
2091 destroy_string_field_class
)) {
2095 BT_LIB_LOGD("Created string field class object: %!+F", string_fc
);
2099 BT_OBJECT_PUT_REF_AND_RESET(string_fc
);
2102 return (void *) string_fc
;
2106 void _bt_field_class_freeze(const struct bt_field_class
*c_fc
)
2108 struct bt_field_class
*fc
= (void *) c_fc
;
2111 * Element/member/option field classes are frozen when added to
2115 bt_value_freeze(fc
->user_attributes
);
2119 case BT_FIELD_CLASS_TYPE_STRUCTURE
:
2120 case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR
:
2121 case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR
:
2122 case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR
:
2124 struct bt_field_class_named_field_class_container
*container_fc
=
2128 for (i
= 0; i
< container_fc
->named_fcs
->len
; i
++) {
2129 bt_named_field_class_freeze(
2130 container_fc
->named_fcs
->pdata
[i
]);
2141 void _bt_named_field_class_freeze(const struct bt_named_field_class
*named_fc
)
2143 BT_ASSERT(named_fc
);
2144 BT_ASSERT(named_fc
->fc
->frozen
);
2145 BT_LIB_LOGD("Freezing named field class's user attributes: %!+v",
2146 named_fc
->user_attributes
);
2147 bt_value_freeze(named_fc
->user_attributes
);
2148 ((struct bt_named_field_class
*) named_fc
)->frozen
= true;
2152 void bt_field_class_make_part_of_trace_class(const struct bt_field_class
*c_fc
)
2154 struct bt_field_class
*fc
= (void *) c_fc
;
2157 BT_ASSERT_PRE(!fc
->part_of_trace_class
,
2158 "Field class is already part of a trace: %!+F", fc
);
2159 fc
->part_of_trace_class
= true;
2162 case BT_FIELD_CLASS_TYPE_STRUCTURE
:
2163 case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR
:
2164 case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR
:
2165 case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR
:
2167 struct bt_field_class_named_field_class_container
*container_fc
=
2171 for (i
= 0; i
< container_fc
->named_fcs
->len
; i
++) {
2172 struct bt_named_field_class
*named_fc
=
2173 container_fc
->named_fcs
->pdata
[i
];
2175 bt_field_class_make_part_of_trace_class(named_fc
->fc
);
2180 case BT_FIELD_CLASS_TYPE_STATIC_ARRAY
:
2181 case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD
:
2182 case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD
:
2184 struct bt_field_class_array
*array_fc
= (void *) fc
;
2186 bt_field_class_make_part_of_trace_class(array_fc
->element_fc
);
2194 const struct bt_value
*bt_field_class_borrow_user_attributes_const(
2195 const struct bt_field_class
*fc
)
2197 BT_ASSERT_PRE_DEV_NON_NULL(fc
, "Field class");
2198 return fc
->user_attributes
;
2201 struct bt_value
*bt_field_class_borrow_user_attributes(
2202 struct bt_field_class
*field_class
)
2204 return (void *) bt_field_class_borrow_user_attributes_const(
2205 (void *) field_class
);
2209 void bt_field_class_set_user_attributes(
2210 struct bt_field_class
*fc
,
2211 const struct bt_value
*user_attributes
)
2213 BT_ASSERT_PRE_NON_NULL(fc
, "Field class");
2214 BT_ASSERT_PRE_NON_NULL(user_attributes
, "User attributes");
2215 BT_ASSERT_PRE(user_attributes
->type
== BT_VALUE_TYPE_MAP
,
2216 "User attributes object is not a map value object.");
2217 BT_ASSERT_PRE_DEV_FC_HOT(fc
, "Field class");
2218 bt_object_put_ref_no_null_check(fc
->user_attributes
);
2219 fc
->user_attributes
= (void *) user_attributes
;
2220 bt_object_get_ref_no_null_check(fc
->user_attributes
);
2224 const struct bt_value
*bt_named_field_class_borrow_user_attributes_const(
2225 const struct bt_named_field_class
*named_fc
)
2227 return named_fc
->user_attributes
;
2231 void bt_named_field_class_set_user_attributes(
2232 struct bt_named_field_class
*named_fc
,
2233 const struct bt_value
*user_attributes
)
2235 BT_ASSERT_PRE_NON_NULL(user_attributes
, "User attributes");
2236 BT_ASSERT_PRE(user_attributes
->type
== BT_VALUE_TYPE_MAP
,
2237 "User attributes object is not a map value object.");
2238 BT_ASSERT_PRE_DEV_HOT(named_fc
,
2239 "Structure field class member or variant field class option",
2241 bt_object_put_ref_no_null_check(named_fc
->user_attributes
);
2242 named_fc
->user_attributes
= (void *) user_attributes
;
2243 bt_object_get_ref_no_null_check(named_fc
->user_attributes
);
2246 const struct bt_value
*
2247 bt_field_class_structure_member_borrow_user_attributes_const(
2248 const struct bt_field_class_structure_member
*member
)
2250 BT_ASSERT_PRE_NON_NULL(member
, "Structure field class member");
2251 return bt_named_field_class_borrow_user_attributes_const(
2252 (const void *) member
);
2256 bt_field_class_structure_member_borrow_user_attributes(
2257 struct bt_field_class_structure_member
*member
)
2259 BT_ASSERT_PRE_NON_NULL(member
, "Structure field class member");
2260 return (void *) bt_named_field_class_borrow_user_attributes_const(
2264 void bt_field_class_structure_member_set_user_attributes(
2265 struct bt_field_class_structure_member
*member
,
2266 const struct bt_value
*user_attributes
)
2268 BT_ASSERT_PRE_NON_NULL(member
, "Structure field class member");
2269 bt_named_field_class_set_user_attributes((void *) member
,
2273 const struct bt_value
*bt_field_class_variant_option_borrow_user_attributes_const(
2274 const struct bt_field_class_variant_option
*option
)
2276 BT_ASSERT_PRE_NON_NULL(option
, "Variant field class option");
2277 return bt_named_field_class_borrow_user_attributes_const(
2278 (const void *) option
);
2281 struct bt_value
*bt_field_class_variant_option_borrow_user_attributes(
2282 struct bt_field_class_variant_option
*option
)
2284 BT_ASSERT_PRE_NON_NULL(option
, "Variant field class option");
2285 return (void *) bt_named_field_class_borrow_user_attributes_const(
2289 void bt_field_class_variant_option_set_user_attributes(
2290 struct bt_field_class_variant_option
*option
,
2291 const struct bt_value
*user_attributes
)
2293 BT_ASSERT_PRE_NON_NULL(option
, "Variant field class option");
2294 bt_named_field_class_set_user_attributes((void *) option
,
2298 void bt_field_class_get_ref(const struct bt_field_class
*field_class
)
2300 bt_object_get_ref(field_class
);
2303 void bt_field_class_put_ref(const struct bt_field_class
*field_class
)
2305 bt_object_put_ref(field_class
);