From 7d7fae6d7f0be96112fe30e47715b83f169bff52 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Wed, 13 Sep 2017 16:51:38 -0400 Subject: [PATCH] Add field value is_set and reset functions to the public API MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérémie Galarneau --- include/babeltrace/ctf-ir/fields-internal.h | 7 - include/babeltrace/ctf-ir/fields.h | 8 +- lib/ctf-ir/fields.c | 195 +++++++++----------- lib/ctf-ir/stream.c | 6 +- 4 files changed, 101 insertions(+), 115 deletions(-) diff --git a/include/babeltrace/ctf-ir/fields-internal.h b/include/babeltrace/ctf-ir/fields-internal.h index f7d39d10..61b60aac 100644 --- a/include/babeltrace/ctf-ir/fields-internal.h +++ b/include/babeltrace/ctf-ir/fields-internal.h @@ -94,10 +94,6 @@ struct bt_ctf_field_string { BT_HIDDEN int bt_ctf_field_validate(struct bt_ctf_field *field); -/* Mark field payload as unset. */ -BT_HIDDEN -int bt_ctf_field_reset(struct bt_ctf_field *field); - BT_HIDDEN int bt_ctf_field_serialize(struct bt_ctf_field *field, struct bt_ctf_stream_pos *pos, @@ -106,7 +102,4 @@ int bt_ctf_field_serialize(struct bt_ctf_field *field, BT_HIDDEN void bt_ctf_field_freeze(struct bt_ctf_field *field); -BT_HIDDEN -bt_bool bt_ctf_field_is_set(struct bt_ctf_field *field); - #endif /* BABELTRACE_CTF_IR_FIELDS_INTERNAL_H */ diff --git a/include/babeltrace/ctf-ir/fields.h b/include/babeltrace/ctf-ir/fields.h index f881e24a..525d3dbd 100644 --- a/include/babeltrace/ctf-ir/fields.h +++ b/include/babeltrace/ctf-ir/fields.h @@ -216,7 +216,13 @@ extern struct bt_ctf_field_type *bt_ctf_field_get_type( @sa bt_ctf_field_is_variant(): Returns whether or not a given field is a @varfield. */ -extern enum bt_ctf_field_type_id bt_ctf_field_get_type_id(struct bt_ctf_field *field); +extern enum bt_ctf_field_type_id bt_ctf_field_get_type_id( + struct bt_ctf_field *field); + + +extern bt_bool bt_ctf_field_value_is_set(struct bt_ctf_field *field); + +extern int bt_ctf_field_reset_value(struct bt_ctf_field *field); /* * bt_ctf_field_signed_integer_get_value: get a signed integer field's value diff --git a/lib/ctf-ir/fields.c b/lib/ctf-ir/fields.c index 95c19fd1..563cd9d6 100644 --- a/lib/ctf-ir/fields.c +++ b/lib/ctf-ir/fields.c @@ -95,19 +95,19 @@ static int bt_ctf_field_sequence_validate(struct bt_ctf_field *); static -int bt_ctf_field_generic_reset(struct bt_ctf_field *); +int bt_ctf_field_generic_reset_value(struct bt_ctf_field *); static -int bt_ctf_field_structure_reset(struct bt_ctf_field *); +int bt_ctf_field_structure_reset_value(struct bt_ctf_field *); static -int bt_ctf_field_variant_reset(struct bt_ctf_field *); +int bt_ctf_field_variant_reset_value(struct bt_ctf_field *); static -int bt_ctf_field_enumeration_reset(struct bt_ctf_field *); +int bt_ctf_field_enumeration_reset_value(struct bt_ctf_field *); static -int bt_ctf_field_array_reset(struct bt_ctf_field *); +int bt_ctf_field_array_reset_value(struct bt_ctf_field *); static -int bt_ctf_field_sequence_reset(struct bt_ctf_field *); +int bt_ctf_field_sequence_reset_value(struct bt_ctf_field *); static -int bt_ctf_field_string_reset(struct bt_ctf_field *); +int bt_ctf_field_string_reset_value(struct bt_ctf_field *); static int bt_ctf_field_integer_serialize(struct bt_ctf_field *, @@ -166,17 +166,17 @@ static void bt_ctf_field_sequence_freeze(struct bt_ctf_field *); static -bt_bool bt_ctf_field_generic_is_set(struct bt_ctf_field *); +bt_bool bt_ctf_field_generic_value_is_set(struct bt_ctf_field *); static -bt_bool bt_ctf_field_structure_is_set(struct bt_ctf_field *); +bt_bool bt_ctf_field_structure_value_is_set(struct bt_ctf_field *); static -bt_bool bt_ctf_field_variant_is_set(struct bt_ctf_field *); +bt_bool bt_ctf_field_variant_value_is_set(struct bt_ctf_field *); static -bt_bool bt_ctf_field_enumeration_is_set(struct bt_ctf_field *); +bt_bool bt_ctf_field_enumeration_value_is_set(struct bt_ctf_field *); static -bt_bool bt_ctf_field_array_is_set(struct bt_ctf_field *); +bt_bool bt_ctf_field_array_value_is_set(struct bt_ctf_field *); static -bt_bool bt_ctf_field_sequence_is_set(struct bt_ctf_field *); +bt_bool bt_ctf_field_sequence_value_is_set(struct bt_ctf_field *); static int increase_packet_size(struct bt_ctf_stream_pos *pos); @@ -221,15 +221,15 @@ int (* const field_validate_funcs[])(struct bt_ctf_field *) = { }; static -int (* const field_reset_funcs[])(struct bt_ctf_field *) = { - [BT_CTF_FIELD_TYPE_ID_INTEGER] = bt_ctf_field_generic_reset, - [BT_CTF_FIELD_TYPE_ID_ENUM] = bt_ctf_field_enumeration_reset, - [BT_CTF_FIELD_TYPE_ID_FLOAT] = bt_ctf_field_generic_reset, - [BT_CTF_FIELD_TYPE_ID_STRUCT] = bt_ctf_field_structure_reset, - [BT_CTF_FIELD_TYPE_ID_VARIANT] = bt_ctf_field_variant_reset, - [BT_CTF_FIELD_TYPE_ID_ARRAY] = bt_ctf_field_array_reset, - [BT_CTF_FIELD_TYPE_ID_SEQUENCE] = bt_ctf_field_sequence_reset, - [BT_CTF_FIELD_TYPE_ID_STRING] = bt_ctf_field_string_reset, +int (* const field_reset_value_funcs[])(struct bt_ctf_field *) = { + [BT_CTF_FIELD_TYPE_ID_INTEGER] = bt_ctf_field_generic_reset_value, + [BT_CTF_FIELD_TYPE_ID_ENUM] = bt_ctf_field_enumeration_reset_value, + [BT_CTF_FIELD_TYPE_ID_FLOAT] = bt_ctf_field_generic_reset_value, + [BT_CTF_FIELD_TYPE_ID_STRUCT] = bt_ctf_field_structure_reset_value, + [BT_CTF_FIELD_TYPE_ID_VARIANT] = bt_ctf_field_variant_reset_value, + [BT_CTF_FIELD_TYPE_ID_ARRAY] = bt_ctf_field_array_reset_value, + [BT_CTF_FIELD_TYPE_ID_SEQUENCE] = bt_ctf_field_sequence_reset_value, + [BT_CTF_FIELD_TYPE_ID_STRING] = bt_ctf_field_string_reset_value, }; static @@ -272,15 +272,15 @@ void (* const field_freeze_funcs[])(struct bt_ctf_field *) = { }; static -bt_bool (* const field_is_set_funcs[])(struct bt_ctf_field *) = { - [BT_CTF_FIELD_TYPE_ID_INTEGER] = bt_ctf_field_generic_is_set, - [BT_CTF_FIELD_TYPE_ID_ENUM] = bt_ctf_field_enumeration_is_set, - [BT_CTF_FIELD_TYPE_ID_FLOAT] = bt_ctf_field_generic_is_set, - [BT_CTF_FIELD_TYPE_ID_STRUCT] = bt_ctf_field_structure_is_set, - [BT_CTF_FIELD_TYPE_ID_VARIANT] = bt_ctf_field_variant_is_set, - [BT_CTF_FIELD_TYPE_ID_ARRAY] = bt_ctf_field_array_is_set, - [BT_CTF_FIELD_TYPE_ID_SEQUENCE] = bt_ctf_field_sequence_is_set, - [BT_CTF_FIELD_TYPE_ID_STRING] = bt_ctf_field_generic_is_set, +bt_bool (* const field_value_is_set_funcs[])(struct bt_ctf_field *) = { + [BT_CTF_FIELD_TYPE_ID_INTEGER] = bt_ctf_field_generic_value_is_set, + [BT_CTF_FIELD_TYPE_ID_ENUM] = bt_ctf_field_enumeration_value_is_set, + [BT_CTF_FIELD_TYPE_ID_FLOAT] = bt_ctf_field_generic_value_is_set, + [BT_CTF_FIELD_TYPE_ID_STRUCT] = bt_ctf_field_structure_value_is_set, + [BT_CTF_FIELD_TYPE_ID_VARIANT] = bt_ctf_field_variant_value_is_set, + [BT_CTF_FIELD_TYPE_ID_ARRAY] = bt_ctf_field_array_value_is_set, + [BT_CTF_FIELD_TYPE_ID_SEQUENCE] = bt_ctf_field_sequence_value_is_set, + [BT_CTF_FIELD_TYPE_ID_STRING] = bt_ctf_field_generic_value_is_set, }; struct bt_ctf_field *bt_ctf_field_create(struct bt_ctf_field_type *type) @@ -1598,8 +1598,7 @@ end: return ret; } -BT_HIDDEN -int bt_ctf_field_reset(struct bt_ctf_field *field) +int bt_ctf_field_reset_value(struct bt_ctf_field *field) { int ret = 0; enum bt_ctf_field_type_id type_id; @@ -1610,6 +1609,13 @@ int bt_ctf_field_reset(struct bt_ctf_field *field) goto end; } + if (field->frozen) { + BT_LOGW("Invalid parameter: field is frozen: addr=%p", + field); + ret = -1; + goto end; + } + type_id = bt_ctf_field_type_get_type_id(field->type); if (type_id <= BT_CTF_FIELD_TYPE_ID_UNKNOWN || type_id >= BT_CTF_NR_TYPE_IDS) { BT_LOGW("Invalid parameter: unknown field type ID: " @@ -1619,7 +1625,7 @@ int bt_ctf_field_reset(struct bt_ctf_field *field) goto end; } - ret = field_reset_funcs[type_id](field); + ret = field_reset_value_funcs[type_id](field); end: return ret; } @@ -1654,11 +1660,9 @@ end: return ret; } - -BT_HIDDEN -bt_bool bt_ctf_field_is_set(struct bt_ctf_field *field) +bt_bool bt_ctf_field_value_is_set(struct bt_ctf_field *field) { - bt_bool is_set = BT_FALSE; + bt_bool value_is_set = BT_FALSE; enum bt_ctf_field_type_id type_id; if (!field) { @@ -1673,9 +1677,9 @@ bt_bool bt_ctf_field_is_set(struct bt_ctf_field *field) goto end; } - is_set = field_is_set_funcs[type_id](field); + value_is_set = field_value_is_set_funcs[type_id](field); end: - return is_set; + return value_is_set; } struct bt_ctf_field *bt_ctf_field_copy(struct bt_ctf_field *field) @@ -2204,7 +2208,7 @@ end: } static -int bt_ctf_field_generic_reset(struct bt_ctf_field *field) +int bt_ctf_field_generic_reset_value(struct bt_ctf_field *field) { int ret = 0; @@ -2220,7 +2224,7 @@ end: } static -int bt_ctf_field_enumeration_reset(struct bt_ctf_field *field) +int bt_ctf_field_enumeration_reset_value(struct bt_ctf_field *field) { int ret = 0; struct bt_ctf_field_enumeration *enumeration; @@ -2237,13 +2241,13 @@ int bt_ctf_field_enumeration_reset(struct bt_ctf_field *field) goto end; } - ret = bt_ctf_field_reset(enumeration->payload); + ret = bt_ctf_field_reset_value(enumeration->payload); end: return ret; } static -int bt_ctf_field_structure_reset(struct bt_ctf_field *field) +int bt_ctf_field_structure_reset_value(struct bt_ctf_field *field) { int64_t i; int ret = 0; @@ -2267,7 +2271,7 @@ int bt_ctf_field_structure_reset(struct bt_ctf_field *field) continue; } - ret = bt_ctf_field_reset(member); + ret = bt_ctf_field_reset_value(member); if (ret) { BT_LOGE("Failed to reset structure field's field: " "struct-field-addr=%p, field-addr=%p, " @@ -2280,7 +2284,7 @@ end: } static -int bt_ctf_field_variant_reset(struct bt_ctf_field *field) +int bt_ctf_field_variant_reset_value(struct bt_ctf_field *field) { int ret = 0; struct bt_ctf_field_variant *variant; @@ -2292,20 +2296,14 @@ int bt_ctf_field_variant_reset(struct bt_ctf_field *field) } variant = container_of(field, struct bt_ctf_field_variant, parent); - if (variant->payload) { - ret = bt_ctf_field_reset(variant->payload); - if (ret) { - BT_LOGW("Failed to reset variant field's payload field: " - "variant-field-addr=%p, payload-field-addr=%p", - field, variant->payload); - } - } + BT_PUT(variant->tag); + BT_PUT(variant->payload); end: return ret; } static -int bt_ctf_field_array_reset(struct bt_ctf_field *field) +int bt_ctf_field_array_reset_value(struct bt_ctf_field *field) { size_t i; int ret = 0; @@ -2329,7 +2327,7 @@ int bt_ctf_field_array_reset(struct bt_ctf_field *field) continue; } - ret = bt_ctf_field_reset(member); + ret = bt_ctf_field_reset_value(member); if (ret) { BT_LOGE("Failed to reset array field's field: " "array-field-addr=%p, field-addr=%p, " @@ -2342,9 +2340,8 @@ end: } static -int bt_ctf_field_sequence_reset(struct bt_ctf_field *field) +int bt_ctf_field_sequence_reset_value(struct bt_ctf_field *field) { - size_t i; int ret = 0; struct bt_ctf_field_sequence *sequence; @@ -2355,31 +2352,17 @@ int bt_ctf_field_sequence_reset(struct bt_ctf_field *field) } sequence = container_of(field, struct bt_ctf_field_sequence, parent); - for (i = 0; i < sequence->elements->len; i++) { - struct bt_ctf_field *member = sequence->elements->pdata[i]; - - if (!member) { - /* - * Sequence elements are lazily initialized; skip if - * this member has not been allocated yet. - */ - continue; - } - - ret = bt_ctf_field_reset(member); - if (ret) { - BT_LOGE("Failed to reset sequence field's field: " - "sequence-field-addr=%p, field-addr=%p, " - "index=%zu", field, member, i); - goto end; - } + if (sequence->elements) { + g_ptr_array_free(sequence->elements, TRUE); + sequence->elements = NULL; } + BT_PUT(sequence->length); end: return ret; } static -int bt_ctf_field_string_reset(struct bt_ctf_field *field) +int bt_ctf_field_string_reset_value(struct bt_ctf_field *field) { int ret = 0; struct bt_ctf_field_string *string; @@ -2390,7 +2373,7 @@ int bt_ctf_field_string_reset(struct bt_ctf_field *field) goto end; } - ret = bt_ctf_field_generic_reset(field); + ret = bt_ctf_field_generic_reset_value(field); if (ret) { goto end; } @@ -2416,7 +2399,7 @@ int bt_ctf_field_integer_serialize(struct bt_ctf_field *field, "native-bo=%s", field, pos->offset, bt_ctf_byte_order_string(native_byte_order)); - if (!bt_ctf_field_generic_is_set(field)) { + if (!bt_ctf_field_generic_value_is_set(field)) { BT_LOGW_STR("Field's payload is not set."); ret = -1; goto end; @@ -2468,7 +2451,7 @@ int bt_ctf_field_floating_point_serialize(struct bt_ctf_field *field, "native-bo=%s", field, pos->offset, bt_ctf_byte_order_string(native_byte_order)); - if (!bt_ctf_field_generic_is_set(field)) { + if (!bt_ctf_field_generic_value_is_set(field)) { BT_LOGW_STR("Field's payload is not set."); ret = -1; goto end; @@ -3137,15 +3120,15 @@ end: } static -bt_bool bt_ctf_field_generic_is_set(struct bt_ctf_field *field) +bt_bool bt_ctf_field_generic_value_is_set(struct bt_ctf_field *field) { return field && field->payload_set; } static -bt_bool bt_ctf_field_enumeration_is_set(struct bt_ctf_field *field) +bt_bool bt_ctf_field_enumeration_value_is_set(struct bt_ctf_field *field) { - bt_bool is_set = BT_FALSE; + bt_bool value_is_set = BT_FALSE; struct bt_ctf_field_enumeration *enumeration; if (!field) { @@ -3158,15 +3141,15 @@ bt_bool bt_ctf_field_enumeration_is_set(struct bt_ctf_field *field) goto end; } - is_set = bt_ctf_field_is_set(enumeration->payload); + value_is_set = bt_ctf_field_value_is_set(enumeration->payload); end: - return is_set; + return value_is_set; } static -bt_bool bt_ctf_field_structure_is_set(struct bt_ctf_field *field) +bt_bool bt_ctf_field_structure_value_is_set(struct bt_ctf_field *field) { - bt_bool is_set = BT_FALSE; + bt_bool value_is_set = BT_FALSE; size_t i; struct bt_ctf_field_structure *structure; @@ -3176,19 +3159,19 @@ bt_bool bt_ctf_field_structure_is_set(struct bt_ctf_field *field) structure = container_of(field, struct bt_ctf_field_structure, parent); for (i = 0; i < structure->fields->len; i++) { - is_set = bt_ctf_field_is_set(structure->fields->pdata[i]); - if (!is_set) { + value_is_set = bt_ctf_field_value_is_set(structure->fields->pdata[i]); + if (!value_is_set) { goto end; } } end: - return is_set; + return value_is_set; } static -bt_bool bt_ctf_field_variant_is_set(struct bt_ctf_field *field) +bt_bool bt_ctf_field_variant_value_is_set(struct bt_ctf_field *field) { - bt_bool is_set = BT_FALSE; + bt_bool value_is_set = BT_FALSE; struct bt_ctf_field_variant *variant; if (!field) { @@ -3196,16 +3179,16 @@ bt_bool bt_ctf_field_variant_is_set(struct bt_ctf_field *field) } variant = container_of(field, struct bt_ctf_field_variant, parent); - is_set = bt_ctf_field_is_set(variant->payload); + value_is_set = bt_ctf_field_value_is_set(variant->payload); end: - return is_set; + return value_is_set; } static -bt_bool bt_ctf_field_array_is_set(struct bt_ctf_field *field) +bt_bool bt_ctf_field_array_value_is_set(struct bt_ctf_field *field) { size_t i; - bt_bool is_set = BT_FALSE; + bt_bool value_is_set = BT_FALSE; struct bt_ctf_field_array *array; if (!field) { @@ -3214,20 +3197,20 @@ bt_bool bt_ctf_field_array_is_set(struct bt_ctf_field *field) array = container_of(field, struct bt_ctf_field_array, parent); for (i = 0; i < array->elements->len; i++) { - is_set = bt_ctf_field_is_set(array->elements->pdata[i]); - if (!is_set) { + value_is_set = bt_ctf_field_value_is_set(array->elements->pdata[i]); + if (!value_is_set) { goto end; } } end: - return is_set; + return value_is_set; } static -bt_bool bt_ctf_field_sequence_is_set(struct bt_ctf_field *field) +bt_bool bt_ctf_field_sequence_value_is_set(struct bt_ctf_field *field) { size_t i; - bt_bool is_set = BT_FALSE; + bt_bool value_is_set = BT_FALSE; struct bt_ctf_field_sequence *sequence; if (!field) { @@ -3235,12 +3218,16 @@ bt_bool bt_ctf_field_sequence_is_set(struct bt_ctf_field *field) } sequence = container_of(field, struct bt_ctf_field_sequence, parent); + if (!sequence->elements) { + goto end; + } + for (i = 0; i < sequence->elements->len; i++) { - is_set = bt_ctf_field_validate(sequence->elements->pdata[i]); - if (!is_set) { + value_is_set = bt_ctf_field_value_is_set(sequence->elements->pdata[i]); + if (!value_is_set) { goto end; } } end: - return is_set; + return value_is_set; } diff --git a/lib/ctf-ir/stream.c b/lib/ctf-ir/stream.c index 70f08d18..5741a7a5 100644 --- a/lib/ctf-ir/stream.c +++ b/lib/ctf-ir/stream.c @@ -360,7 +360,7 @@ int set_packet_context_events_discarded(struct bt_ctf_stream *stream) * discarded events. We do not allow wrapping here. If it's * valid, update the stream's current count. */ - if (bt_ctf_field_is_set(field)) { + if (bt_ctf_field_value_is_set(field)) { uint64_t user_val; ret = bt_ctf_field_unsigned_integer_get_value(field, @@ -1494,7 +1494,7 @@ void reset_structure_field(struct bt_ctf_field *structure, const char *name) member = bt_ctf_field_structure_get_field(structure, name); if (member) { - (void) bt_ctf_field_reset(member); + (void) bt_ctf_field_reset_value(member); bt_put(member); } } @@ -1862,7 +1862,7 @@ int _set_structure_field_integer(struct bt_ctf_field *structure, char *name, } /* Make sure the payload has not already been set. */ - if (!force && bt_ctf_field_is_set(integer)) { + if (!force && bt_ctf_field_value_is_set(integer)) { /* Payload already set, not an error */ BT_LOGV("Field's payload is already set: struct-field-addr=%p, " "name=\"%s\", force=%d", structure, name, force); -- 2.34.1