X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=src%2Flib%2Ftrace-ir%2Ffield-class.c;h=ce356b409f6c4008b76ac9bd071d3c49009c8c4f;hp=ecb827a5fe836bd816730b9a587f2e4c23067d10;hb=ed47d321ee0ab3e7ceb0271ead1e3d941f96e02b;hpb=76276a81e72d967979674fdc0a646b42d8d6033e diff --git a/src/lib/trace-ir/field-class.c b/src/lib/trace-ir/field-class.c index ecb827a5..ce356b40 100644 --- a/src/lib/trace-ir/field-class.c +++ b/src/lib/trace-ir/field-class.c @@ -898,7 +898,7 @@ int init_named_field_class(struct bt_named_field_class *named_fc, } named_fc->fc = fc; - bt_object_get_no_null_check(named_fc->fc); + bt_object_get_ref_no_null_check(named_fc->fc); end: return status; @@ -954,7 +954,7 @@ create_variant_with_selector_option( } opt->range_set = range_set; - bt_object_get_no_null_check(opt->range_set); + bt_object_get_ref_no_null_check(opt->range_set); bt_integer_range_set_freeze(range_set); goto end; @@ -1153,43 +1153,92 @@ void destroy_option_field_class(struct bt_object *obj) finalize_field_class((void *) obj); BT_LOGD_STR("Putting content field class."); BT_OBJECT_PUT_REF_AND_RESET(fc->content_fc); - BT_LOGD_STR("Putting selector field path."); - BT_OBJECT_PUT_REF_AND_RESET(fc->selector_field_path); - BT_LOGD_STR("Putting selector field class."); - BT_OBJECT_PUT_REF_AND_RESET(fc->selector_fc); + + if (fc->common.type != BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR) { + struct bt_field_class_option_with_selector *with_sel_fc = + (void *) obj; + + BT_LOGD_STR("Putting selector field path."); + BT_OBJECT_PUT_REF_AND_RESET(with_sel_fc->selector_field_path); + BT_LOGD_STR("Putting selector field class."); + BT_OBJECT_PUT_REF_AND_RESET(with_sel_fc->selector_fc); + + if (fc->common.type != BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR) { + struct bt_field_class_option_with_selector_integer *with_int_sel_fc = + (void *) obj; + + BT_LOGD_STR("Putting integer range set."); + BT_OBJECT_PUT_REF_AND_RESET(with_int_sel_fc->range_set); + } + } + g_free(fc); } -struct bt_field_class *bt_field_class_option_create(bt_trace_class *trace_class, - bt_field_class *content_fc, bt_field_class *selector_fc) +static +struct bt_field_class *create_option_field_class( + struct bt_trace_class *trace_class, + enum bt_field_class_type fc_type, + struct bt_field_class *content_fc, + struct bt_field_class *selector_fc) { struct bt_field_class_option *opt_fc = NULL; BT_ASSERT_PRE_NON_NULL(trace_class, "Trace class"); BT_ASSERT_PRE_NON_NULL(content_fc, "Content field class"); BT_LIB_LOGD("Creating option field class: " - "%![content-fc-]+F, %![sel-fc-]+F", content_fc, selector_fc); - opt_fc = g_new0(struct bt_field_class_option, 1); - if (!opt_fc) { - BT_LIB_LOGE_APPEND_CAUSE( - "Failed to allocate one option field class."); - goto error; + "type=%s, %![content-fc-]+F, %![sel-fc-]+F", + bt_common_field_class_type_string(fc_type), + content_fc, selector_fc); + + if (fc_type != BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR) { + struct bt_field_class_option_with_selector *opt_with_sel_fc = NULL; + + BT_ASSERT_PRE_NON_NULL(selector_fc, "Selector field class"); + + if (fc_type == BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR) { + BT_ASSERT_PRE_FC_HAS_ID(selector_fc, + BT_FIELD_CLASS_TYPE_BOOL, + "Selector field class"); + opt_with_sel_fc = (void *) g_new0( + struct bt_field_class_option_with_selector_bool, 1); + } else { + BT_ASSERT_PRE_FC_IS_INT(selector_fc, + "Selector field class"); + opt_with_sel_fc = (void *) g_new0( + struct bt_field_class_option_with_selector_integer, 1); + } + + if (!opt_with_sel_fc) { + BT_LIB_LOGE_APPEND_CAUSE( + "Failed to allocate one option with selector field class."); + goto error; + } + + opt_with_sel_fc->selector_fc = selector_fc; + bt_object_get_ref_no_null_check(opt_with_sel_fc->selector_fc); + opt_fc = (void *) opt_with_sel_fc; + } else { + opt_fc = g_new0(struct bt_field_class_option, 1); + if (!opt_fc) { + BT_LIB_LOGE_APPEND_CAUSE( + "Failed to allocate one option field class."); + goto error; + } } - if (init_field_class((void *) opt_fc, BT_FIELD_CLASS_TYPE_OPTION, + BT_ASSERT(opt_fc); + + if (init_field_class((void *) opt_fc, fc_type, destroy_option_field_class)) { goto error; } opt_fc->content_fc = content_fc; - bt_object_get_no_null_check(opt_fc->content_fc); + bt_object_get_ref_no_null_check(opt_fc->content_fc); bt_field_class_freeze(opt_fc->content_fc); if (selector_fc) { - BT_ASSERT_PRE_FC_HAS_ID(selector_fc, BT_FIELD_CLASS_TYPE_BOOL, - "Selector field class"); - opt_fc->selector_fc = selector_fc; - bt_object_get_no_null_check(opt_fc->selector_fc); bt_field_class_freeze(selector_fc); } @@ -1204,14 +1253,100 @@ end: return (void *) opt_fc; } +struct bt_field_class *bt_field_class_option_without_selector_create( + struct bt_trace_class *trace_class, + struct bt_field_class *content_fc) +{ + return create_option_field_class(trace_class, + BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR, + content_fc, NULL); +} + +struct bt_field_class *bt_field_class_option_with_selector_bool_create( + struct bt_trace_class *trace_class, + struct bt_field_class *content_fc, + struct bt_field_class *selector_fc) +{ + struct bt_field_class_option_with_selector_bool *fc = + (void *) create_option_field_class(trace_class, + BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR, + content_fc, selector_fc); + + if (!fc) { + goto end; + } + +end: + return (void *) fc; +} + +struct bt_field_class * +bt_field_class_option_with_selector_integer_unsigned_create( + struct bt_trace_class *trace_class, + struct bt_field_class *content_fc, + struct bt_field_class *selector_fc, + const struct bt_integer_range_set_unsigned *u_range_set) +{ + struct bt_field_class_option_with_selector_integer *fc; + const struct bt_integer_range_set *range_set = + (const void *) u_range_set; + + BT_ASSERT_PRE_NON_NULL(range_set, "Integer range set"); + BT_ASSERT_PRE(range_set->ranges->len > 0, + "Integer range set is empty: %!+R", range_set); + fc = (void *) create_option_field_class(trace_class, + BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR, + content_fc, selector_fc); + + if (!fc) { + goto end; + } + + fc->range_set = range_set; + bt_object_get_ref_no_null_check(fc->range_set); + bt_integer_range_set_freeze(range_set); + +end: + return (void *) fc; +} + +struct bt_field_class * +bt_field_class_option_with_selector_integer_signed_create( + struct bt_trace_class *trace_class, + struct bt_field_class *content_fc, + struct bt_field_class *selector_fc, + const struct bt_integer_range_set_signed *i_range_set) +{ + struct bt_field_class_option_with_selector_integer *fc; + const struct bt_integer_range_set *range_set = + (const void *) i_range_set; + + BT_ASSERT_PRE_NON_NULL(range_set, "Integer range set"); + BT_ASSERT_PRE(range_set->ranges->len > 0, + "Integer range set is empty: %!+R", range_set); + fc = (void *) create_option_field_class(trace_class, + BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR, + content_fc, selector_fc); + + if (!fc) { + goto end; + } + + fc->range_set = range_set; + bt_object_get_ref_no_null_check(fc->range_set); + bt_integer_range_set_freeze(range_set); + +end: + return (void *) fc; +} + const struct bt_field_class *bt_field_class_option_borrow_field_class_const( const struct bt_field_class *fc) { struct bt_field_class_option *opt_fc = (void *) fc; BT_ASSERT_PRE_NON_NULL(fc, "Field class"); - BT_ASSERT_PRE_DEV_FC_HAS_ID(fc, BT_FIELD_CLASS_TYPE_OPTION, - "Field class"); + BT_ASSERT_PRE_FC_IS_OPTION(fc, "Field class"); return opt_fc->content_fc; } @@ -1221,23 +1356,69 @@ struct bt_field_class *bt_field_class_option_borrow_field_class( struct bt_field_class_option *opt_fc = (void *) fc; BT_ASSERT_PRE_NON_NULL(fc, "Field class"); - BT_ASSERT_PRE_DEV_FC_HAS_ID(fc, BT_FIELD_CLASS_TYPE_OPTION, - "Field class"); + BT_ASSERT_PRE_FC_IS_OPTION(fc, "Field class"); return opt_fc->content_fc; } const struct bt_field_path * -bt_field_class_option_borrow_selector_field_path_const( +bt_field_class_option_with_selector_borrow_selector_field_path_const( const struct bt_field_class *fc) { - struct bt_field_class_option *opt_fc = (void *) fc; + const struct bt_field_class_option_with_selector *opt_fc = + (const void *) fc; BT_ASSERT_PRE_NON_NULL(fc, "Field class"); - BT_ASSERT_PRE_DEV_FC_HAS_ID(fc, BT_FIELD_CLASS_TYPE_OPTION, - "Field class"); + BT_ASSERT_PRE_FC_IS_OPTION_WITH_SEL(fc, "Field class"); return opt_fc->selector_field_path; } +void bt_field_class_option_with_selector_bool_set_selector_is_reversed( + struct bt_field_class *fc, bt_bool sel_is_reversed) +{ + struct bt_field_class_option_with_selector_bool *opt_fc = (void *) fc; + + BT_ASSERT_PRE_NON_NULL(fc, "Field class"); + BT_ASSERT_PRE_FC_HAS_ID(fc, + BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR, "Field class"); + BT_ASSERT_PRE_DEV_FC_HOT(fc, "Field class"); + opt_fc->sel_is_reversed = sel_is_reversed; +} + +bt_bool bt_field_class_option_with_selector_bool_selector_is_reversed( + const struct bt_field_class *fc) +{ + struct bt_field_class_option_with_selector_bool *opt_fc = (void *) fc; + + BT_ASSERT_PRE_NON_NULL(fc, "Field class"); + BT_ASSERT_PRE_FC_HAS_ID(fc, + BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR, "Field class"); + return opt_fc->sel_is_reversed; +} + +const struct bt_integer_range_set_unsigned * +bt_field_class_option_with_selector_integer_unsigned_borrow_selector_ranges_const( + const struct bt_field_class *fc) +{ + struct bt_field_class_option_with_selector_integer *opt_fc = + (void *) fc; + + BT_ASSERT_PRE_NON_NULL(fc, "Field class"); + BT_ASSERT_PRE_FC_IS_OPTION_WITH_INT_SEL(fc, "Field class"); + return (const void *) opt_fc->range_set; +} + +const struct bt_integer_range_set_signed * +bt_field_class_option_with_selector_integer_signed_borrow_selector_ranges_const( + const struct bt_field_class *fc) +{ + struct bt_field_class_option_with_selector_integer *opt_fc = + (void *) fc; + + BT_ASSERT_PRE_NON_NULL(fc, "Field class"); + BT_ASSERT_PRE_FC_IS_OPTION_WITH_INT_SEL(fc, "Field class"); + return (const void *) opt_fc->range_set; +} + static void finalize_variant_field_class(struct bt_field_class_variant *var_fc) { @@ -1299,9 +1480,9 @@ struct bt_field_class *bt_field_class_variant_create( if (selector_fc->type == BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER || selector_fc->type == BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION) { - fc_type = BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR; + fc_type = BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR; } else { - fc_type = BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR; + fc_type = BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR; } ret = init_named_field_classes_container( @@ -1314,9 +1495,11 @@ struct bt_field_class *bt_field_class_variant_create( } var_with_sel_fc->selector_fc = selector_fc; - bt_object_get_no_null_check(var_with_sel_fc->selector_fc); + bt_object_get_ref_no_null_check(var_with_sel_fc->selector_fc); bt_field_class_freeze(selector_fc); var_fc = (void *) var_with_sel_fc; + BT_LIB_LOGD("Created default variant field class with selector object: " + "%![var-fc-]+F, %![sel-fc-]+F", var_fc, selector_fc); } else { var_fc = g_new0(struct bt_field_class_variant, 1); if (!var_fc) { @@ -1332,11 +1515,11 @@ struct bt_field_class *bt_field_class_variant_create( /* init_named_field_classes_container() logs errors */ goto error; } + BT_LIB_LOGD("Created default variant field class without selector object: " + "%![var-fc-]+F", var_fc); } BT_ASSERT(var_fc); - BT_LIB_LOGD("Created default variant field class with selector object: " - "%![var-fc-]+F, %![sel-fc-]+F", var_fc, selector_fc); goto end; error: @@ -1485,7 +1668,7 @@ int append_option_to_variant_with_selector_field_class( BT_ASSERT_PRE(range_set->ranges->len > 0, "Integer range set is empty: %!+R", range_set); status = ranges_overlap(var_fc->common.common.named_fcs, range_set, - expected_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR, + expected_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR, &has_overlap); if (status) { /* ranges_overlap() logs errors */ @@ -1517,26 +1700,26 @@ end: return status; } -enum bt_field_class_variant_with_selector_append_option_status -bt_field_class_variant_with_selector_unsigned_append_option( +enum bt_field_class_variant_with_selector_integer_append_option_status +bt_field_class_variant_with_selector_integer_unsigned_append_option( struct bt_field_class *fc, const char *name, struct bt_field_class *option_fc, const struct bt_integer_range_set_unsigned *range_set) { return append_option_to_variant_with_selector_field_class(fc, name, option_fc, (const void *) range_set, - BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR); + BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR); } -enum bt_field_class_variant_with_selector_append_option_status -bt_field_class_variant_with_selector_signed_append_option( +enum bt_field_class_variant_with_selector_integer_append_option_status +bt_field_class_variant_with_selector_integer_signed_append_option( struct bt_field_class *fc, const char *name, struct bt_field_class *option_fc, const struct bt_integer_range_set_signed *range_set) { return append_option_to_variant_with_selector_field_class(fc, name, option_fc, (const void *) range_set, - BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR); + BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR); } uint64_t bt_field_class_variant_get_option_count(const struct bt_field_class *fc) @@ -1592,52 +1775,52 @@ bt_field_class_variant_borrow_option_by_index( (void *) fc, index); } -const struct bt_field_class_variant_with_selector_unsigned_option * -bt_field_class_variant_with_selector_unsigned_borrow_option_by_name_const( +const struct bt_field_class_variant_with_selector_integer_unsigned_option * +bt_field_class_variant_with_selector_integer_unsigned_borrow_option_by_name_const( const struct bt_field_class *fc, const char *name) { BT_ASSERT_PRE_DEV_NON_NULL(fc, "Field class"); BT_ASSERT_PRE_DEV_FC_HAS_ID(fc, - BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR, + BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR, "Field class"); return (const void *) borrow_named_field_class_from_container_field_class_by_name( (void *) fc, name); } -const struct bt_field_class_variant_with_selector_unsigned_option * -bt_field_class_variant_with_selector_unsigned_borrow_option_by_index_const( +const struct bt_field_class_variant_with_selector_integer_unsigned_option * +bt_field_class_variant_with_selector_integer_unsigned_borrow_option_by_index_const( const struct bt_field_class *fc, uint64_t index) { BT_ASSERT_PRE_DEV_NON_NULL(fc, "Field class"); BT_ASSERT_PRE_DEV_FC_HAS_ID(fc, - BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR, + BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR, "Field class"); return (const void *) borrow_named_field_class_from_container_field_class_at_index( (void *) fc, index); } -const struct bt_field_class_variant_with_selector_signed_option * -bt_field_class_variant_with_selector_signed_borrow_option_by_name_const( +const struct bt_field_class_variant_with_selector_integer_signed_option * +bt_field_class_variant_with_selector_integer_signed_borrow_option_by_name_const( const struct bt_field_class *fc, const char *name) { BT_ASSERT_PRE_DEV_NON_NULL(fc, "Field class"); BT_ASSERT_PRE_DEV_FC_HAS_ID(fc, - BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR, + BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR, "Field class"); return (const void *) borrow_named_field_class_from_container_field_class_by_name( (void *) fc, name); } -const struct bt_field_class_variant_with_selector_signed_option * -bt_field_class_variant_with_selector_signed_borrow_option_by_index_const( +const struct bt_field_class_variant_with_selector_integer_signed_option * +bt_field_class_variant_with_selector_integer_signed_borrow_option_by_index_const( const struct bt_field_class *fc, uint64_t index) { BT_ASSERT_PRE_DEV_NON_NULL(fc, "Field class"); BT_ASSERT_PRE_DEV_FC_HAS_ID(fc, - BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR, + BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR, "Field class"); return (const void *) borrow_named_field_class_from_container_field_class_at_index( @@ -1674,8 +1857,8 @@ bt_field_class_variant_option_borrow_field_class( } const struct bt_integer_range_set_unsigned * -bt_field_class_variant_with_selector_unsigned_option_borrow_ranges_const( - const struct bt_field_class_variant_with_selector_unsigned_option *option) +bt_field_class_variant_with_selector_integer_unsigned_option_borrow_ranges_const( + const struct bt_field_class_variant_with_selector_integer_unsigned_option *option) { const struct bt_field_class_variant_with_selector_option *opt = (const void *) option; @@ -1685,8 +1868,8 @@ bt_field_class_variant_with_selector_unsigned_option_borrow_ranges_const( } const struct bt_integer_range_set_signed * -bt_field_class_variant_with_selector_signed_option_borrow_ranges_const( - const struct bt_field_class_variant_with_selector_signed_option *option) +bt_field_class_variant_with_selector_integer_signed_option_borrow_ranges_const( + const struct bt_field_class_variant_with_selector_integer_signed_option *option) { const struct bt_field_class_variant_with_selector_option *opt = (const void *) option; @@ -1721,7 +1904,7 @@ int init_array_field_class(struct bt_field_class_array *fc, } fc->element_fc = element_fc; - bt_object_get_no_null_check(fc->element_fc); + bt_object_get_ref_no_null_check(fc->element_fc); bt_field_class_freeze(element_fc); end: @@ -1852,7 +2035,7 @@ struct bt_field_class *bt_field_class_array_dynamic_create( BT_ASSERT_PRE_FC_IS_UNSIGNED_INT(length_fc, "Length field class"); array_fc->length_fc = length_fc; - bt_object_get_no_null_check(array_fc->length_fc); + bt_object_get_ref_no_null_check(array_fc->length_fc); bt_field_class_freeze(length_fc); } @@ -1931,8 +2114,8 @@ void _bt_field_class_freeze(const struct bt_field_class *c_fc) switch (fc->type) { case BT_FIELD_CLASS_TYPE_STRUCTURE: case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR: - case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR: - case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR: + case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR: + case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR: { struct bt_field_class_named_field_class_container *container_fc = (void *) fc; @@ -1974,8 +2157,8 @@ void bt_field_class_make_part_of_trace_class(const struct bt_field_class *c_fc) switch (fc->type) { case BT_FIELD_CLASS_TYPE_STRUCTURE: case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR: - case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR: - case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR: + case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR: + case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR: { struct bt_field_class_named_field_class_container *container_fc = (void *) fc; @@ -2027,9 +2210,9 @@ void bt_field_class_set_user_attributes( BT_ASSERT_PRE(user_attributes->type == BT_VALUE_TYPE_MAP, "User attributes object is not a map value object."); BT_ASSERT_PRE_DEV_FC_HOT(fc, "Field class"); - bt_object_put_no_null_check(fc->user_attributes); + bt_object_put_ref_no_null_check(fc->user_attributes); fc->user_attributes = (void *) user_attributes; - bt_object_get_no_null_check(fc->user_attributes); + bt_object_get_ref_no_null_check(fc->user_attributes); } static @@ -2050,9 +2233,9 @@ void bt_named_field_class_set_user_attributes( BT_ASSERT_PRE_DEV_HOT(named_fc, "Structure field class member or variant field class option", "."); - bt_object_put_no_null_check(named_fc->user_attributes); + bt_object_put_ref_no_null_check(named_fc->user_attributes); named_fc->user_attributes = (void *) user_attributes; - bt_object_get_no_null_check(named_fc->user_attributes); + bt_object_get_ref_no_null_check(named_fc->user_attributes); } const struct bt_value *