ctf.fs: bt_ctf_notif_iter_create(): assert() that all medops exist
[babeltrace.git] / formats / ctf / ir / fields.c
index 04fba5cf22492d0d0534668cf325d04edec07740..0ad52a020dc05a79095c506ca13941e016187190 100644 (file)
@@ -161,6 +161,19 @@ void bt_ctf_field_array_freeze(struct bt_ctf_field *);
 static
 void bt_ctf_field_sequence_freeze(struct bt_ctf_field *);
 
+static
+bool bt_ctf_field_generic_is_set(struct bt_ctf_field *);
+static
+bool bt_ctf_field_structure_is_set(struct bt_ctf_field *);
+static
+bool bt_ctf_field_variant_is_set(struct bt_ctf_field *);
+static
+bool bt_ctf_field_enumeration_is_set(struct bt_ctf_field *);
+static
+bool bt_ctf_field_array_is_set(struct bt_ctf_field *);
+static
+bool bt_ctf_field_sequence_is_set(struct bt_ctf_field *);
+
 static
 int increase_packet_size(struct ctf_stream_pos *pos);
 
@@ -254,6 +267,18 @@ void (* const field_freeze_funcs[])(struct bt_ctf_field *) = {
        [BT_CTF_TYPE_ID_SEQUENCE] = bt_ctf_field_sequence_freeze,
 };
 
+static
+bool (* const field_is_set_funcs[])(struct bt_ctf_field *) = {
+       [BT_CTF_TYPE_ID_INTEGER] = bt_ctf_field_generic_is_set,
+       [BT_CTF_TYPE_ID_ENUM] = bt_ctf_field_enumeration_is_set,
+       [BT_CTF_TYPE_ID_FLOAT] = bt_ctf_field_generic_is_set,
+       [BT_CTF_TYPE_ID_STRUCT] = bt_ctf_field_structure_is_set,
+       [BT_CTF_TYPE_ID_VARIANT] = bt_ctf_field_variant_is_set,
+       [BT_CTF_TYPE_ID_ARRAY] = bt_ctf_field_array_is_set,
+       [BT_CTF_TYPE_ID_SEQUENCE] = bt_ctf_field_sequence_is_set,
+       [BT_CTF_TYPE_ID_STRING] = bt_ctf_field_generic_is_set,
+};
+
 struct bt_ctf_field *bt_ctf_field_create(struct bt_ctf_field_type *type)
 {
        struct bt_ctf_field *field = NULL;
@@ -841,15 +866,14 @@ end:
        return container;
 }
 
-const char *bt_ctf_field_enumeration_get_mapping_name(
-       struct bt_ctf_field *field)
+struct bt_ctf_field_type_enumeration_mapping_iterator *
+bt_ctf_field_enumeration_get_mappings(struct bt_ctf_field *field)
 {
        int ret;
-       const char *name = NULL;
        struct bt_ctf_field *container = NULL;
        struct bt_ctf_field_type *container_type = NULL;
        struct bt_ctf_field_type_integer *integer_type = NULL;
-       struct bt_ctf_field_type_enumeration *enumeration_type = NULL;
+       struct bt_ctf_field_type_enumeration_mapping_iterator *iter = NULL;
 
        container = bt_ctf_field_enumeration_get_container(field);
        if (!container) {
@@ -863,29 +887,27 @@ const char *bt_ctf_field_enumeration_get_mapping_name(
 
        integer_type = container_of(container_type,
                struct bt_ctf_field_type_integer, parent);
-       enumeration_type = container_of(field->type,
-               struct bt_ctf_field_type_enumeration, parent);
 
        if (!integer_type->declaration.signedness) {
                uint64_t value;
+
                ret = bt_ctf_field_unsigned_integer_get_value(container,
                      &value);
                if (ret) {
                        goto error_put_container_type;
                }
-
-               name = bt_ctf_field_type_enumeration_get_mapping_name_unsigned(
-                       enumeration_type, value);
+               iter = bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value(
+                               field->type, value);
        } else {
                int64_t value;
+
                ret = bt_ctf_field_signed_integer_get_value(container,
                      &value);
                if (ret) {
                        goto error_put_container_type;
                }
-
-               name = bt_ctf_field_type_enumeration_get_mapping_name_signed(
-                       enumeration_type, value);
+               iter = bt_ctf_field_type_enumeration_find_mappings_by_signed_value(
+                               field->type, value);
        }
 
 error_put_container_type:
@@ -893,7 +915,7 @@ error_put_container_type:
 error_put_container:
        bt_put(container);
 end:
-       return name;
+       return iter;
 }
 
 int bt_ctf_field_signed_integer_get_value(struct bt_ctf_field *field,
@@ -1243,6 +1265,27 @@ end:
        return ret;
 }
 
+
+BT_HIDDEN
+bool bt_ctf_field_is_set(struct bt_ctf_field *field)
+{
+       bool is_set = false;
+       enum bt_ctf_type_id type_id;
+
+       if (!field) {
+               goto end;
+       }
+
+       type_id = bt_ctf_field_type_get_type_id(field->type);
+       if (type_id <= BT_CTF_TYPE_ID_UNKNOWN || type_id >= BT_CTF_NR_TYPE_IDS) {
+               goto end;
+       }
+
+       is_set = field_is_set_funcs[type_id](field);
+end:
+       return is_set;
+}
+
 struct bt_ctf_field *bt_ctf_field_copy(struct bt_ctf_field *field)
 {
        int ret;
@@ -1641,7 +1684,7 @@ int bt_ctf_field_array_validate(struct bt_ctf_field *field)
        for (i = 0; i < array->elements->len; i++) {
                ret = bt_ctf_field_validate(array->elements->pdata[i]);
                if (ret) {
-                       fprintf(stderr, "Failed to validate sequence field #%zu\n", i);
+                       fprintf(stderr, "Failed to validate array field #%zu\n", i);
                        goto end;
                }
        }
@@ -1860,6 +1903,10 @@ int bt_ctf_field_integer_serialize(struct bt_ctf_field *field,
        struct bt_ctf_field_integer *integer = container_of(field,
                struct bt_ctf_field_integer, parent);
 
+       if (!bt_ctf_field_generic_is_set(field)) {
+               ret = -1;
+               goto end;
+       }
 retry:
        ret = ctf_integer_write(&pos->parent, &integer->definition.p);
        if (ret == -EFAULT) {
@@ -1895,6 +1942,10 @@ int bt_ctf_field_floating_point_serialize(struct bt_ctf_field *field,
        struct bt_ctf_field_floating_point *floating_point = container_of(field,
                struct bt_ctf_field_floating_point, parent);
 
+       if (!bt_ctf_field_generic_is_set(field)) {
+               ret = -1;
+               goto end;
+       }
 retry:
        ret = ctf_float_write(&pos->parent, &floating_point->definition.p);
        if (ret == -EFAULT) {
@@ -1936,20 +1987,20 @@ int bt_ctf_field_structure_serialize(struct bt_ctf_field *field,
        }
 
        for (i = 0; i < structure->fields->len; i++) {
-               struct bt_ctf_field *field = g_ptr_array_index(
+               struct bt_ctf_field *member = g_ptr_array_index(
                        structure->fields, i);
 
-               ret = bt_ctf_field_serialize(field, pos);
+               ret = bt_ctf_field_serialize(member, pos);
                if (ret) {
                        const char *name;
-                       struct bt_ctf_field_type *field_type =
+                       struct bt_ctf_field_type *structure_type =
                                        bt_ctf_field_get_type(field);
 
-                       (void) bt_ctf_field_type_structure_get_field(field_type,
-                                       &name, NULL, i);
+                       (void) bt_ctf_field_type_structure_get_field(
+                                       structure_type, &name, NULL, i);
                        fprintf(stderr, "Field %s failed to serialize\n",
                                        name ? name : "NULL");
-                       bt_put(field_type);
+                       bt_put(structure_type);
                        break;
                }
        }
@@ -2398,3 +2449,112 @@ void bt_ctf_field_freeze(struct bt_ctf_field *field)
 end:
        return;
 }
+
+static
+bool bt_ctf_field_generic_is_set(struct bt_ctf_field *field)
+{
+       return field && field->payload_set;
+}
+
+static
+bool bt_ctf_field_enumeration_is_set(struct bt_ctf_field *field)
+{
+       bool is_set = false;
+       struct bt_ctf_field_enumeration *enumeration;
+
+       if (!field) {
+               goto end;
+       }
+
+       enumeration = container_of(field, struct bt_ctf_field_enumeration,
+                       parent);
+       if (!enumeration->payload) {
+               goto end;
+       }
+
+       is_set = bt_ctf_field_is_set(enumeration->payload);
+end:
+       return is_set;
+}
+
+static
+bool bt_ctf_field_structure_is_set(struct bt_ctf_field *field)
+{
+       bool is_set = false;
+       size_t i;
+       struct bt_ctf_field_structure *structure;
+
+       if (!field) {
+               goto end;
+       }
+
+       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) {
+                       goto end;
+               }
+       }
+end:
+       return is_set;
+}
+
+static
+bool bt_ctf_field_variant_is_set(struct bt_ctf_field *field)
+{
+       bool is_set = false;
+       struct bt_ctf_field_variant *variant;
+
+       if (!field) {
+               goto end;
+       }
+
+       variant = container_of(field, struct bt_ctf_field_variant, parent);
+       is_set = bt_ctf_field_is_set(variant->payload);
+end:
+       return is_set;
+}
+
+static
+bool bt_ctf_field_array_is_set(struct bt_ctf_field *field)
+{
+       size_t i;
+       bool is_set = false;
+       struct bt_ctf_field_array *array;
+
+       if (!field) {
+               goto end;
+       }
+
+       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) {
+                       goto end;
+               }
+       }
+end:
+       return is_set;
+}
+
+static
+bool bt_ctf_field_sequence_is_set(struct bt_ctf_field *field)
+{
+       size_t i;
+       bool is_set = false;
+       struct bt_ctf_field_sequence *sequence;
+
+       if (!field) {
+               goto end;
+       }
+
+       sequence = container_of(field, struct bt_ctf_field_sequence, parent);
+       for (i = 0; i < sequence->elements->len; i++) {
+               is_set = bt_ctf_field_validate(sequence->elements->pdata[i]);
+               if (!is_set) {
+                       goto end;
+               }
+       }
+end:
+       return is_set;
+}
This page took 0.025915 seconds and 4 git commands to generate.