X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Flib%2Ftrace-ir%2Ffield.c;h=62113d576d08f11b1bc722ad6e3a80ca7aeb8b74;hb=1094efa4f2edbf019427bf0322dab3f3ea9ec5ab;hp=95a76e49a95ee4177cf5ca68225b894141dc3fa6;hpb=5cebbe7fc898bb1d887cbdac1f4dd5f0042443fd;p=babeltrace.git diff --git a/src/lib/trace-ir/field.c b/src/lib/trace-ir/field.c index 95a76e49..62113d57 100644 --- a/src/lib/trace-ir/field.c +++ b/src/lib/trace-ir/field.c @@ -47,6 +47,9 @@ void reset_array_field(struct bt_field *field); static void reset_structure_field(struct bt_field *field); +static +void reset_option_field(struct bt_field *field); + static void reset_variant_field(struct bt_field *field); @@ -59,6 +62,9 @@ void set_array_field_is_frozen(struct bt_field *field, bool is_frozen); static void set_structure_field_is_frozen(struct bt_field *field, bool is_frozen); +static +void set_option_field_is_frozen(struct bt_field *field, bool is_frozen); + static void set_variant_field_is_frozen(struct bt_field *field, bool is_frozen); @@ -71,6 +77,9 @@ bool array_field_is_set(const struct bt_field *field); static bool structure_field_is_set(const struct bt_field *field); +static +bool option_field_is_set(const struct bt_field *field); + static bool variant_field_is_set(const struct bt_field *field); @@ -81,6 +90,13 @@ struct bt_field_methods bool_field_methods = { .reset = reset_single_field, }; +static +struct bt_field_methods bit_array_field_methods = { + .set_is_frozen = set_single_field_is_frozen, + .is_set = single_field_is_set, + .reset = reset_single_field, +}; + static struct bt_field_methods integer_field_methods = { .set_is_frozen = set_single_field_is_frozen, @@ -116,6 +132,13 @@ struct bt_field_methods array_field_methods = { .reset = reset_array_field, }; +static +struct bt_field_methods option_field_methods = { + .set_is_frozen = set_option_field_is_frozen, + .is_set = option_field_is_set, + .reset = reset_option_field, +}; + static struct bt_field_methods variant_field_methods = { .set_is_frozen = set_variant_field_is_frozen, @@ -126,6 +149,9 @@ struct bt_field_methods variant_field_methods = { static struct bt_field *create_bool_field(struct bt_field_class *); +static +struct bt_field *create_bit_array_field(struct bt_field_class *); + static struct bt_field *create_integer_field(struct bt_field_class *); @@ -144,12 +170,16 @@ struct bt_field *create_static_array_field(struct bt_field_class *); static struct bt_field *create_dynamic_array_field(struct bt_field_class *); +static +struct bt_field *create_option_field(struct bt_field_class *); + static struct bt_field *create_variant_field(struct bt_field_class *); static struct bt_field *(* const field_create_funcs[])(struct bt_field_class *) = { [BT_FIELD_CLASS_TYPE_BOOL] = create_bool_field, + [BT_FIELD_CLASS_TYPE_BIT_ARRAY] = create_bit_array_field, [BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER] = create_integer_field, [BT_FIELD_CLASS_TYPE_SIGNED_INTEGER] = create_integer_field, [BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION] = create_integer_field, @@ -159,6 +189,7 @@ struct bt_field *(* const field_create_funcs[])(struct bt_field_class *) = { [BT_FIELD_CLASS_TYPE_STRUCTURE] = create_structure_field, [BT_FIELD_CLASS_TYPE_STATIC_ARRAY] = create_static_array_field, [BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY] = create_dynamic_array_field, + [BT_FIELD_CLASS_TYPE_OPTION] = create_option_field, [BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR] = create_variant_field, [BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR] = create_variant_field, [BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR] = create_variant_field, @@ -167,6 +198,9 @@ struct bt_field *(* const field_create_funcs[])(struct bt_field_class *) = { static void destroy_bool_field(struct bt_field *field); +static +void destroy_bit_array_field(struct bt_field *field); + static void destroy_integer_field(struct bt_field *field); @@ -182,12 +216,16 @@ void destroy_structure_field(struct bt_field *field); static void destroy_array_field(struct bt_field *field); +static +void destroy_option_field(struct bt_field *field); + static void destroy_variant_field(struct bt_field *field); static void (* const field_destroy_funcs[])(struct bt_field *) = { [BT_FIELD_CLASS_TYPE_BOOL] = destroy_bool_field, + [BT_FIELD_CLASS_TYPE_BIT_ARRAY] = destroy_bit_array_field, [BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER] = destroy_integer_field, [BT_FIELD_CLASS_TYPE_SIGNED_INTEGER] = destroy_integer_field, [BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION] = destroy_integer_field, @@ -197,6 +235,7 @@ void (* const field_destroy_funcs[])(struct bt_field *) = { [BT_FIELD_CLASS_TYPE_STRUCTURE] = destroy_structure_field, [BT_FIELD_CLASS_TYPE_STATIC_ARRAY] = destroy_array_field, [BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY] = destroy_array_field, + [BT_FIELD_CLASS_TYPE_OPTION] = destroy_option_field, [BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR] = destroy_variant_field, [BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR] = destroy_variant_field, [BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR] = destroy_variant_field, @@ -270,6 +309,26 @@ end: return (void *) bool_field; } +static +struct bt_field *create_bit_array_field(struct bt_field_class *fc) +{ + struct bt_field_bit_array *ba_field; + + BT_LIB_LOGD("Creating bit array field object: %![fc-]+F", fc); + ba_field = g_new0(struct bt_field_bit_array, 1); + if (!ba_field) { + BT_LIB_LOGE_APPEND_CAUSE( + "Failed to allocate one bit array field."); + goto end; + } + + init_field((void *) ba_field, fc, &bit_array_field_methods); + BT_LIB_LOGD("Created bit array field object: %!+f", ba_field); + +end: + return (void *) ba_field; +} + static struct bt_field *create_integer_field(struct bt_field_class *fc) { @@ -406,6 +465,37 @@ end: return (void *) struct_field; } +static +struct bt_field *create_option_field(struct bt_field_class *fc) +{ + struct bt_field_option *opt_field; + struct bt_field_class_option *opt_fc = (void *) fc; + + BT_LIB_LOGD("Creating option field object: %![fc-]+F", fc); + opt_field = g_new0(struct bt_field_option, 1); + if (!opt_field) { + BT_LIB_LOGE_APPEND_CAUSE( + "Failed to allocate one option field."); + goto end; + } + + init_field((void *) opt_field, fc, &option_field_methods); + opt_field->content_field = bt_field_create(opt_fc->content_fc); + if (!opt_field->content_field) { + BT_LIB_LOGE_APPEND_CAUSE( + "Failed to create option field's content field: " + "%![opt-fc-]+F, %![content-fc-]+F", + opt_fc, opt_fc->content_fc); + BT_OBJECT_PUT_REF_AND_RESET(opt_field); + goto end; + } + + BT_LIB_LOGD("Created option field object: %!+f", opt_field); + +end: + return (void *) opt_field; +} + static struct bt_field *create_variant_field(struct bt_field_class *fc) { @@ -552,6 +642,38 @@ void bt_field_bool_set_value(struct bt_field *field, bt_bool value) bt_field_set_single(field, true); } +uint64_t bt_field_bit_array_get_value_as_integer(const struct bt_field *field) +{ + const struct bt_field_bit_array *ba_field = (const void *) field; + + BT_ASSERT_PRE_DEV_NON_NULL(field, "Field"); + BT_ASSERT_PRE_DEV_FIELD_IS_SET(field, "Field"); + BT_ASSERT_PRE_DEV_FIELD_HAS_CLASS_TYPE(field, + BT_FIELD_CLASS_TYPE_BIT_ARRAY, "Field"); + return ba_field->value_as_int; +} + +void bt_field_bit_array_set_value_as_integer(struct bt_field *field, + uint64_t value) +{ + struct bt_field_bit_array *ba_field = (void *) field; + struct bt_field_class_bit_array *ba_fc; + + BT_ASSERT_PRE_DEV_NON_NULL(field, "Field"); + BT_ASSERT_PRE_DEV_FIELD_HAS_CLASS_TYPE(field, + BT_FIELD_CLASS_TYPE_BIT_ARRAY, "Field"); + BT_ASSERT_PRE_DEV_FIELD_HOT(field, "Field"); + ba_fc = (void *) field->class; + ba_field->value_as_int = value; + + if (ba_fc->length < 64) { + /* Apply mask */ + ba_field->value_as_int &= ((UINT64_C(1) << ba_fc->length) - 1); + } + + bt_field_set_single(field, true); +} + int64_t bt_field_integer_signed_get_value(const struct bt_field *field) { const struct bt_field_integer *int_field = (const void *) field; @@ -907,6 +1029,38 @@ const struct bt_field *bt_field_structure_borrow_member_field_by_name_const( (void *) field, name); } +void bt_field_option_set_has_field(struct bt_field *field, bt_bool has_field) +{ + struct bt_field_option *opt_field = (void *) field; + + BT_ASSERT_PRE_DEV_NON_NULL(field, "Field"); + BT_ASSERT_PRE_DEV_FIELD_HAS_CLASS_TYPE(field, + BT_FIELD_CLASS_TYPE_OPTION, "Field"); + BT_ASSERT_PRE_DEV_FIELD_HOT(field, "Field"); + + if (has_field) { + opt_field->selected_field = opt_field->content_field; + } else { + opt_field->selected_field = NULL; + } +} + +struct bt_field *bt_field_option_borrow_field(struct bt_field *field) +{ + struct bt_field_option *opt_field = (void *) field; + + BT_ASSERT_PRE_DEV_NON_NULL(field, "Field"); + BT_ASSERT_PRE_DEV_FIELD_HAS_CLASS_TYPE(field, + BT_FIELD_CLASS_TYPE_OPTION, "Field"); + return opt_field->selected_field; +} + +const struct bt_field *bt_field_option_borrow_field_const( + const struct bt_field *field) +{ + return (const void *) bt_field_option_borrow_field((void *) field); +} + static inline struct bt_field *borrow_variant_field_selected_option_field( struct bt_field *field) @@ -1019,6 +1173,15 @@ void destroy_bool_field(struct bt_field *field) g_free(field); } +static +void destroy_bit_array_field(struct bt_field *field) +{ + BT_ASSERT(field); + BT_LIB_LOGD("Destroying bit array field object: %!+f", field); + bt_field_finalize(field); + g_free(field); +} + static void destroy_integer_field(struct bt_field *field) { @@ -1054,6 +1217,22 @@ void destroy_structure_field(struct bt_field *field) g_free(field); } +static +void destroy_option_field(struct bt_field *field) +{ + struct bt_field_option *opt_field = (void *) field; + + BT_ASSERT(field); + BT_LIB_LOGD("Destroying option field object: %!+f", field); + bt_field_finalize(field); + + if (opt_field->content_field) { + bt_field_destroy(opt_field->content_field); + } + + g_free(field); +} + static void destroy_variant_field(struct bt_field *field) { @@ -1132,6 +1311,16 @@ void reset_structure_field(struct bt_field *field) } } +static +void reset_option_field(struct bt_field *field) +{ + struct bt_field_option *opt_field = (void *) field; + + BT_ASSERT(opt_field); + bt_field_reset(opt_field->content_field); + opt_field->selected_field = NULL; +} + static void reset_variant_field(struct bt_field *field) { @@ -1179,12 +1368,23 @@ void set_structure_field_is_frozen(struct bt_field *field, bool is_frozen) BT_LIB_LOGD("Setting structure field's member field's " "frozen state: %![field-]+f, index=%" PRIu64, member_field, i); - bt_field_set_is_frozen(member_field, is_frozen); + _bt_field_set_is_frozen(member_field, is_frozen); } set_single_field_is_frozen(field, is_frozen); } +static +void set_option_field_is_frozen(struct bt_field *field, bool is_frozen) +{ + struct bt_field_option *opt_field = (void *) field; + + BT_LIB_LOGD("Setting option field's frozen state: " + "%![field-]+f, is-frozen=%d", field, is_frozen); + _bt_field_set_is_frozen(opt_field->content_field, is_frozen); + set_single_field_is_frozen(field, is_frozen); +} + static void set_variant_field_is_frozen(struct bt_field *field, bool is_frozen) { @@ -1200,7 +1400,7 @@ void set_variant_field_is_frozen(struct bt_field *field, bool is_frozen) BT_LIB_LOGD("Setting variant field's option field's " "frozen state: %![field-]+f, index=%" PRIu64, option_field, i); - bt_field_set_is_frozen(option_field, is_frozen); + _bt_field_set_is_frozen(option_field, is_frozen); } set_single_field_is_frozen(field, is_frozen); @@ -1221,7 +1421,7 @@ void set_array_field_is_frozen(struct bt_field *field, bool is_frozen) BT_LIB_LOGD("Setting array field's element field's " "frozen state: %![field-]+f, index=%" PRIu64, elem_field, i); - bt_field_set_is_frozen(elem_field, is_frozen); + _bt_field_set_is_frozen(elem_field, is_frozen); } set_single_field_is_frozen(field, is_frozen); @@ -1265,6 +1465,21 @@ end: return is_set; } +static +bool option_field_is_set(const struct bt_field *field) +{ + const struct bt_field_option *opt_field = (const void *) field; + bool is_set = false; + + BT_ASSERT(field); + + if (opt_field->selected_field) { + is_set = bt_field_is_set(opt_field->selected_field); + } + + return is_set; +} + static bool variant_field_is_set(const struct bt_field *field) {