ir: add bt_ctf_field_freeze()
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Sat, 13 Feb 2016 01:50:40 +0000 (20:50 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Mon, 22 Feb 2016 17:49:16 +0000 (12:49 -0500)
Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
formats/ctf/ir/fields.c
formats/ctf/ir/packet.c
include/babeltrace/ctf-ir/fields-internal.h

index 93e9486c504b158a31e363b59c9f1b6bc4f4b80f..3ca57bb017ba097bce5517fd17735a1cbf08c168 100644 (file)
@@ -148,6 +148,19 @@ int bt_ctf_field_sequence_copy(struct bt_ctf_field *, struct bt_ctf_field *);
 static
 int bt_ctf_field_string_copy(struct bt_ctf_field *, struct bt_ctf_field *);
 
+static
+void generic_field_freeze(struct bt_ctf_field *);
+static
+void bt_ctf_field_enumeration_freeze(struct bt_ctf_field *);
+static
+void bt_ctf_field_structure_freeze(struct bt_ctf_field *);
+static
+void bt_ctf_field_variant_freeze(struct bt_ctf_field *);
+static
+void bt_ctf_field_array_freeze(struct bt_ctf_field *);
+static
+void bt_ctf_field_sequence_freeze(struct bt_ctf_field *);
+
 static
 int increase_packet_size(struct ctf_stream_pos *pos);
 
@@ -229,6 +242,18 @@ int (* const field_copy_funcs[])(struct bt_ctf_field *,
        [BT_CTF_TYPE_ID_STRING] = bt_ctf_field_string_copy,
 };
 
+static
+void (* const field_freeze_funcs[])(struct bt_ctf_field *) = {
+       [BT_CTF_TYPE_ID_INTEGER] = generic_field_freeze,
+       [BT_CTF_TYPE_ID_FLOAT] = generic_field_freeze,
+       [BT_CTF_TYPE_ID_STRING] = generic_field_freeze,
+       [BT_CTF_TYPE_ID_ENUM] = bt_ctf_field_enumeration_freeze,
+       [BT_CTF_TYPE_ID_STRUCT] = bt_ctf_field_structure_freeze,
+       [BT_CTF_TYPE_ID_VARIANT] = bt_ctf_field_variant_freeze,
+       [BT_CTF_TYPE_ID_ARRAY] = bt_ctf_field_array_freeze,
+       [BT_CTF_TYPE_ID_SEQUENCE] = bt_ctf_field_sequence_freeze,
+};
+
 struct bt_ctf_field *bt_ctf_field_create(struct bt_ctf_field_type *type)
 {
        struct bt_ctf_field *field = NULL;
@@ -375,7 +400,7 @@ int bt_ctf_field_sequence_set_length(struct bt_ctf_field *field,
        struct bt_ctf_field_sequence *sequence;
        uint64_t sequence_length;
 
-       if (!field || !length_field) {
+       if (!field || !length_field || field->frozen) {
                ret = -1;
                goto end;
        }
@@ -447,6 +472,11 @@ struct bt_ctf_field *bt_ctf_field_structure_get_field(
                goto end;
        }
 
+       /* We don't want to modify this field if it's frozen */
+       if (field->frozen) {
+               goto end;
+       }
+
        new_field = bt_ctf_field_create(field_type);
        if (!new_field) {
                goto error;
@@ -488,6 +518,11 @@ struct bt_ctf_field *bt_ctf_field_structure_get_field_by_index(
                goto end;
        }
 
+       /* We don't want to modify this field if it's frozen */
+       if (field->frozen) {
+               goto end;
+       }
+
        /* Field has not been instanciated yet, create it */
        structure_type = bt_ctf_field_get_type(field);
        if (!structure_type) {
@@ -524,7 +559,7 @@ int bt_ctf_field_structure_set_field(struct bt_ctf_field *field,
        struct bt_ctf_field_type *expected_field_type = NULL;
        size_t index;
 
-       if (!field || !name || !value ||
+       if (!field || !name || !value || field->frozen ||
                bt_ctf_field_type_get_type_id(field->type) !=
                        BT_CTF_TYPE_ID_STRUCT) {
                ret = -1;
@@ -583,6 +618,11 @@ struct bt_ctf_field *bt_ctf_field_array_get_field(struct bt_ctf_field *field,
                goto end;
        }
 
+       /* We don't want to modify this field if it's frozen */
+       if (field->frozen) {
+               goto end;
+       }
+
        new_field = bt_ctf_field_create(field_type);
        array->elements->pdata[(size_t)index] = new_field;
 end:
@@ -618,6 +658,11 @@ struct bt_ctf_field *bt_ctf_field_sequence_get_field(struct bt_ctf_field *field,
                goto end;
        }
 
+       /* We don't want to modify this field if it's frozen */
+       if (field->frozen) {
+               goto end;
+       }
+
        new_field = bt_ctf_field_create(field_type);
        sequence->elements->pdata[(size_t) index] = new_field;
 end:
@@ -691,6 +736,11 @@ struct bt_ctf_field *bt_ctf_field_variant_get_field(struct bt_ctf_field *field,
                }
        }
 
+       /* We don't want to modify this field if it's frozen */
+       if (field->frozen) {
+               goto end;
+       }
+
        field_type = bt_ctf_field_type_variant_get_field_type_signed(
                variant_type, tag_enum_value);
        if (!field_type) {
@@ -752,6 +802,11 @@ struct bt_ctf_field *bt_ctf_field_enumeration_get_container(
        enumeration = container_of(field, struct bt_ctf_field_enumeration,
                parent);
        if (!enumeration->payload) {
+               /* We don't want to modify this field if it's frozen */
+               if (field->frozen) {
+                       goto end;
+               }
+
                struct bt_ctf_field_type_enumeration *enumeration_type =
                        container_of(field->type,
                        struct bt_ctf_field_type_enumeration, parent);
@@ -857,7 +912,7 @@ int bt_ctf_field_signed_integer_set_value(struct bt_ctf_field *field,
        unsigned int size;
        int64_t min_value, max_value;
 
-       if (!field ||
+       if (!field || field->frozen ||
                bt_ctf_field_type_get_type_id(field->type) !=
                        BT_CTF_TYPE_ID_INTEGER) {
                ret = -1;
@@ -923,7 +978,7 @@ int bt_ctf_field_unsigned_integer_set_value(struct bt_ctf_field *field,
        unsigned int size;
        uint64_t max_value;
 
-       if (!field ||
+       if (!field || field->frozen ||
                bt_ctf_field_type_get_type_id(field->type) !=
                        BT_CTF_TYPE_ID_INTEGER) {
                ret = -1;
@@ -977,7 +1032,7 @@ int bt_ctf_field_floating_point_set_value(struct bt_ctf_field *field,
        int ret = 0;
        struct bt_ctf_field_floating_point *floating_point;
 
-       if (!field ||
+       if (!field || field->frozen ||
                bt_ctf_field_type_get_type_id(field->type) !=
                        BT_CTF_TYPE_ID_FLOAT) {
                ret = -1;
@@ -1015,7 +1070,7 @@ int bt_ctf_field_string_set_value(struct bt_ctf_field *field,
        int ret = 0;
        struct bt_ctf_field_string *string;
 
-       if (!field || !value ||
+       if (!field || !value || field->frozen ||
                bt_ctf_field_type_get_type_id(field->type) !=
                        BT_CTF_TYPE_ID_STRING) {
                ret = -1;
@@ -1040,7 +1095,7 @@ int bt_ctf_field_string_append(struct bt_ctf_field *field,
        int ret = 0;
        struct bt_ctf_field_string *string_field;
 
-       if (!field || !value ||
+       if (!field || !value || field->frozen ||
                bt_ctf_field_type_get_type_id(field->type) !=
                        BT_CTF_TYPE_ID_STRING) {
                ret = -1;
@@ -1069,7 +1124,7 @@ int bt_ctf_field_string_append_len(struct bt_ctf_field *field,
        unsigned int effective_length = length;
        struct bt_ctf_field_string *string_field;
 
-       if (!field || !value ||
+       if (!field || !value || field->frozen ||
                bt_ctf_field_type_get_type_id(field->type) !=
                        BT_CTF_TYPE_ID_STRING) {
                ret = -1;
@@ -2200,3 +2255,96 @@ int increase_packet_size(struct ctf_stream_pos *pos)
 end:
        return ret;
 }
+
+static
+void generic_field_freeze(struct bt_ctf_field *field)
+{
+       field->frozen = 1;
+}
+
+static
+void bt_ctf_field_enumeration_freeze(struct bt_ctf_field *field)
+{
+       struct bt_ctf_field_enumeration *enum_field =
+               container_of(field, struct bt_ctf_field_enumeration, parent);
+
+       bt_ctf_field_freeze(enum_field->payload);
+       generic_field_freeze(field);
+}
+
+static
+void bt_ctf_field_structure_freeze(struct bt_ctf_field *field)
+{
+       int i;
+       struct bt_ctf_field_structure *structure_field =
+               container_of(field, struct bt_ctf_field_structure, parent);
+
+       for (i = 0; i < structure_field->fields->len; i++) {
+               struct bt_ctf_field *field =
+                       g_ptr_array_index(structure_field->fields, i);
+
+               bt_ctf_field_freeze(field);
+       }
+
+       generic_field_freeze(field);
+}
+
+static
+void bt_ctf_field_variant_freeze(struct bt_ctf_field *field)
+{
+       struct bt_ctf_field_variant *variant_field =
+               container_of(field, struct bt_ctf_field_variant, parent);
+
+       bt_ctf_field_freeze(variant_field->tag);
+       bt_ctf_field_freeze(variant_field->payload);
+       generic_field_freeze(field);
+}
+
+static
+void bt_ctf_field_array_freeze(struct bt_ctf_field *field)
+{
+       int i;
+       struct bt_ctf_field_array *array_field =
+               container_of(field, struct bt_ctf_field_array, parent);
+
+       for (i = 0; i < array_field->elements->len; i++) {
+               struct bt_ctf_field *field =
+                       g_ptr_array_index(array_field->elements, i);
+
+               bt_ctf_field_freeze(field);
+       }
+
+       generic_field_freeze(field);
+}
+
+static
+void bt_ctf_field_sequence_freeze(struct bt_ctf_field *field)
+{
+       int i;
+       struct bt_ctf_field_sequence *sequence_field =
+               container_of(field, struct bt_ctf_field_sequence, parent);
+
+       bt_ctf_field_freeze(sequence_field->length);
+
+       for (i = 0; i < sequence_field->elements->len; i++) {
+               struct bt_ctf_field *field =
+                       g_ptr_array_index(sequence_field->elements, i);
+
+               bt_ctf_field_freeze(field);
+       }
+
+       generic_field_freeze(field);
+}
+
+BT_HIDDEN
+void bt_ctf_field_freeze(struct bt_ctf_field *field)
+{
+       if (!field) {
+               goto end;
+       }
+
+       field_freeze_funcs[bt_ctf_field_get_type_id(field)](field);
+
+end:
+       return;
+}
index c74b3833163bd026e9d9684f1da13ab1aec930b6..59e193fc9a12a7b76dd25e67ae4434efa9b37c71 100644 (file)
@@ -137,6 +137,8 @@ void bt_ctf_packet_freeze(struct bt_ctf_packet *packet)
                return;
        }
 
+       bt_ctf_field_freeze(packet->header);
+       bt_ctf_field_freeze(packet->context);
        packet->frozen = 1;
 }
 
index bd95bd2ec35d9f871d1388e0b6150dd95d0e0d73..a75120f3da2cde26f64956d46e5bd53a6e7215f3 100644 (file)
@@ -37,6 +37,7 @@ struct bt_ctf_field {
        struct bt_object base;
        struct bt_ctf_field_type *type;
        int payload_set;
+       int frozen;
 };
 
 struct bt_ctf_field_integer {
@@ -102,4 +103,7 @@ BT_HIDDEN
 int bt_ctf_field_serialize(struct bt_ctf_field *field,
                struct ctf_stream_pos *pos);
 
+BT_HIDDEN
+void bt_ctf_field_freeze(struct bt_ctf_field *field);
+
 #endif /* BABELTRACE_CTF_IR_FIELDS_INTERNAL_H */
This page took 0.030374 seconds and 4 git commands to generate.