#include <babeltrace/ctf-writer/event-types.h>
#include <babeltrace/ctf-ir/event-types-internal.h>
#include <babeltrace/ctf-ir/utils.h>
-#include <babeltrace/ctf-ir/ref.h>
-#include <babeltrace/ctf-ir/common-internal.h>
+#include <babeltrace/ref.h>
#include <babeltrace/ctf-ir/clock.h>
#include <babeltrace/ctf-writer/writer-internal.h>
+#include <babeltrace/object-internal.h>
+#include <babeltrace/ref.h>
#include <babeltrace/compiler.h>
#include <babeltrace/endian.h>
#include <float.h>
};
static
-void bt_ctf_field_type_destroy(struct bt_ref *);
+void bt_ctf_field_type_destroy(struct bt_object *);
static
void bt_ctf_field_type_integer_destroy(struct bt_ctf_field_type *);
static
static
void destroy_structure_field(struct structure_field *field)
{
- if (field->type) {
- bt_ctf_field_type_put(field->type);
- }
-
+ bt_put(field->type);
g_free(field);
}
assert(type && (type_id > CTF_TYPE_UNKNOWN) &&
(type_id < NR_CTF_TYPES));
- bt_ctf_base_init(type, bt_ctf_field_type_destroy);
+ bt_object_init(type, bt_ctf_field_type_destroy);
type->freeze = type_freeze_funcs[type_id];
type->serialize = type_serialize_funcs[type_id];
goto end;
}
- bt_ctf_field_type_get(field_type);
+ bt_get(field_type);
field->name = name_quark;
field->type = field_type;
g_hash_table_insert(field_name_to_index,
}
static
-void bt_ctf_field_type_destroy(struct bt_ref *ref)
+void bt_ctf_field_type_destroy(struct bt_object *obj)
{
struct bt_ctf_field_type *type;
- struct bt_ctf_base *base;
enum ctf_type_id type_id;
- if (!ref) {
- return;
- }
-
- base = container_of(ref, struct bt_ctf_base, ref_count);
- type = container_of(base, struct bt_ctf_field_type, base);
+ type = container_of(obj, struct bt_ctf_field_type, base);
type_id = type->declaration->id;
if (type_id <= CTF_TYPE_UNKNOWN ||
type_id >= NR_CTF_TYPES) {
integer = container_of(type, struct bt_ctf_field_type_integer, parent);
clock = integer->mapped_clock;
- if (clock) {
- bt_ctf_clock_get(clock);
- }
+ bt_get(clock);
end:
return clock;
}
}
integer = container_of(type, struct bt_ctf_field_type_integer, parent);
- if (integer->mapped_clock) {
- bt_ctf_clock_put(integer->mapped_clock);
- }
-
- if (clock) {
- bt_ctf_clock_get(clock);
- }
-
+ bt_put(integer->mapped_clock);
+ bt_get(clock);
integer->mapped_clock = clock;
end:
return ret;
enumeration->parent.declaration = &enumeration->declaration.p;
enumeration->parent.declaration->id = CTF_TYPE_ENUM;
- bt_ctf_field_type_get(integer_container_type);
+ bt_get(integer_container_type);
enumeration->container = integer_container_type;
enumeration->entries = g_ptr_array_new_with_free_func(
(GDestroyNotify)destroy_enumeration_mapping);
enumeration_type = container_of(type,
struct bt_ctf_field_type_enumeration, parent);
container_type = enumeration_type->container;
- bt_ctf_field_type_get(container_type);
+ bt_get(container_type);
end:
return container_type;
}
field = g_ptr_array_index(structure->fields, index);
if (field_type) {
*field_type = field->type;
- bt_ctf_field_type_get(field->type);
+ bt_get(field->type);
}
if (field_name) {
*field_name = g_quark_to_string(field->name);
field = structure->fields->pdata[index];
field_type = field->type;
- bt_ctf_field_type_get(field_type);
+ bt_get(field_type);
end:
return field_type;
}
variant->tag_name = g_string_new(tag_name);
variant->field_name_to_index = g_hash_table_new(NULL, NULL);
variant->fields = g_ptr_array_new_with_free_func(
- (GDestroyNotify)destroy_structure_field);
+ (GDestroyNotify) destroy_structure_field);
if (enum_tag) {
- bt_ctf_field_type_get(enum_tag);
+ bt_get(enum_tag);
variant->tag = container_of(enum_tag,
struct bt_ctf_field_type_enumeration, parent);
}
}
tag_type = &variant->tag->parent;
- bt_ctf_field_type_get(tag_type);
+ bt_get(tag_type);
end:
return tag_type;
}
field = g_ptr_array_index(variant->fields, index);
field_type = field->type;
- bt_ctf_field_type_get(field_type);
+ bt_get(field_type);
end:
return field_type;
}
field = g_ptr_array_index(variant->fields, index);
if (field_type) {
*field_type = field->type;
- bt_ctf_field_type_get(field->type);
+ bt_get(field->type);
}
if (field_name) {
*field_name = g_quark_to_string(field->name);
array->parent.declaration = &array->declaration.p;
array->parent.declaration->id = CTF_TYPE_ARRAY;
- bt_ctf_field_type_get(element_type);
+ bt_get(element_type);
array->element_type = element_type;
array->length = length;
bt_ctf_field_type_init(&array->parent, FALSE);
array = container_of(type, struct bt_ctf_field_type_array, parent);
ret = array->element_type;
- bt_ctf_field_type_get(ret);
+ bt_get(ret);
+end:
+ return ret;
+}
+
+BT_HIDDEN
+int bt_ctf_field_type_array_set_element_type(struct bt_ctf_field_type *type,
+ struct bt_ctf_field_type *element_type)
+{
+ int ret = 0;
+ struct bt_ctf_field_type_array *array;
+
+ if (!type || !element_type ||
+ (type->declaration->id != CTF_TYPE_ARRAY)) {
+ ret = -1;
+ goto end;
+ }
+
+ array = container_of(type, struct bt_ctf_field_type_array, parent);
+
+ if (array->element_type) {
+ BT_PUT(array->element_type);
+ }
+
+ array->element_type = element_type;
+ bt_get(array->element_type);
+
end:
return ret;
}
sequence->parent.declaration = &sequence->declaration.p;
sequence->parent.declaration->id = CTF_TYPE_SEQUENCE;
- bt_ctf_field_type_get(element_type);
+ bt_get(element_type);
sequence->element_type = element_type;
sequence->length_field_name = g_string_new(length_field_name);
bt_ctf_field_type_init(&sequence->parent, FALSE);
sequence = container_of(type, struct bt_ctf_field_type_sequence,
parent);
ret = sequence->element_type;
- bt_ctf_field_type_get(ret);
+ bt_get(ret);
+end:
+ return ret;
+}
+
+BT_HIDDEN
+int bt_ctf_field_type_sequence_set_element_type(struct bt_ctf_field_type *type,
+ struct bt_ctf_field_type *element_type)
+{
+ int ret = 0;
+ struct bt_ctf_field_type_sequence *sequence;
+
+ if (!type || !element_type ||
+ (type->declaration->id != CTF_TYPE_SEQUENCE)) {
+ ret = -1;
+ goto end;
+ }
+
+ sequence = container_of(type, struct bt_ctf_field_type_sequence, parent);
+
+ if (sequence->element_type) {
+ BT_PUT(sequence->element_type);
+ }
+
+ sequence->element_type = element_type;
+ bt_get(sequence->element_type);
+
end:
return ret;
}
}
ret = bt_ctf_field_type_get_alignment(element);
- bt_ctf_field_type_put(element);
+ bt_put(element);
break;
}
case CTF_TYPE_ARRAY:
}
ret = bt_ctf_field_type_get_alignment(element);
- bt_ctf_field_type_put(element);
+ bt_put(element);
break;
}
case CTF_TYPE_STRUCT:
assert(field);
field_alignment = bt_ctf_field_type_get_alignment(
field);
- bt_ctf_field_type_put(field);
+ bt_put(field);
if (field_alignment < 0) {
ret = field_alignment;
goto end;
return type->declaration->id;
}
+int bt_ctf_field_type_is_integer(struct bt_ctf_field_type *type)
+{
+ return bt_ctf_field_type_get_type_id(type) == CTF_TYPE_INTEGER;
+}
+
+int bt_ctf_field_type_is_floating_point(struct bt_ctf_field_type *type)
+{
+ return bt_ctf_field_type_get_type_id(type) == CTF_TYPE_FLOAT;
+}
+
+int bt_ctf_field_type_is_enumeration(struct bt_ctf_field_type *type)
+{
+ return bt_ctf_field_type_get_type_id(type) == CTF_TYPE_ENUM;
+}
+
+int bt_ctf_field_type_is_string(struct bt_ctf_field_type *type)
+{
+ return bt_ctf_field_type_get_type_id(type) == CTF_TYPE_STRING;
+}
+
+int bt_ctf_field_type_is_structure(struct bt_ctf_field_type *type)
+{
+ return bt_ctf_field_type_get_type_id(type) == CTF_TYPE_STRUCT;
+}
+
+int bt_ctf_field_type_is_array(struct bt_ctf_field_type *type)
+{
+ return bt_ctf_field_type_get_type_id(type) == CTF_TYPE_ARRAY;
+}
+
+int bt_ctf_field_type_is_sequence(struct bt_ctf_field_type *type)
+{
+ return bt_ctf_field_type_get_type_id(type) == CTF_TYPE_SEQUENCE;
+}
+
+int bt_ctf_field_type_is_variant(struct bt_ctf_field_type *type)
+{
+ return bt_ctf_field_type_get_type_id(type) == CTF_TYPE_VARIANT;
+}
+
void bt_ctf_field_type_get(struct bt_ctf_field_type *type)
{
- bt_ctf_get(type);
+ bt_get(type);
}
void bt_ctf_field_type_put(struct bt_ctf_field_type *type)
{
- bt_ctf_put(type);
+ bt_put(type);
}
BT_HIDDEN
goto end;
}
- bt_ctf_field_type_get(field);
- bt_ctf_field_type_put(((struct structure_field *)
+ bt_get(field);
+ bt_put(((struct structure_field *)
g_ptr_array_index(structure->fields, index))->type);
((struct structure_field *) structure->fields->pdata[index])->type =
field;
variant = container_of(type, struct bt_ctf_field_type_variant,
parent);
- bt_ctf_field_type_get(tag);
+ bt_get(tag);
if (variant->tag) {
- bt_ctf_field_type_put(&variant->tag->parent);
+ bt_put(&variant->tag->parent);
}
variant->tag = container_of(tag, struct bt_ctf_field_type_enumeration,
parent);
goto end;
}
- bt_ctf_field_type_get(field);
- bt_ctf_field_type_put(((struct structure_field *)
+ bt_get(field);
+ bt_put(((struct structure_field *)
g_ptr_array_index(variant->fields, index))->type);
((struct structure_field *) variant->fields->pdata[index])->type =
field;
return;
}
- if (integer->mapped_clock) {
- bt_ctf_clock_put(integer->mapped_clock);
- }
+ bt_put(integer->mapped_clock);
g_free(integer);
}
}
g_ptr_array_free(enumeration->entries, TRUE);
- bt_ctf_field_type_put(enumeration->container);
+ bt_put(enumeration->container);
g_free(enumeration);
}
g_ptr_array_free(variant->fields, TRUE);
g_hash_table_destroy(variant->field_name_to_index);
g_string_free(variant->tag_name, TRUE);
- bt_ctf_field_type_put(&variant->tag->parent);
+ bt_put(&variant->tag->parent);
bt_ctf_field_path_destroy(variant->tag_path);
g_free(variant);
}
return;
}
- bt_ctf_field_type_put(array->element_type);
+ bt_put(array->element_type);
g_free(array);
}
return;
}
- bt_ctf_field_type_put(sequence->element_type);
+ bt_put(sequence->element_type);
g_string_free(sequence->length_field_name, TRUE);
bt_ctf_field_path_destroy(sequence->length_field_path);
g_free(sequence);
struct bt_ctf_field_type_variant *variant_type = container_of(
type, struct bt_ctf_field_type_variant, parent);
- /* Cache the alignment */
- type->declaration->alignment = bt_ctf_field_type_get_alignment(type);
generic_field_type_freeze(type);
g_ptr_array_foreach(variant_type->fields,
(GFunc) freeze_structure_field, NULL);
g_string_assign(context->field_name, "");
}
error_put_container_type:
- bt_ctf_field_type_put(container_type);
+ bt_put(container_type);
end:
return ret;
}
parent);
copy_integer->declaration = integer->declaration;
if (integer->mapped_clock) {
- bt_ctf_clock_get(integer->mapped_clock);
+ bt_get(integer->mapped_clock);
copy_integer->mapped_clock = integer->mapped_clock;
}
end:
copy_enumeration->declaration = enumeration->declaration;
end:
- if (copy_container) {
- bt_ctf_field_type_put(copy_container);
- }
+ bt_put(copy_container);
return copy;
error:
- if (copy_container) {
- bt_ctf_field_type_put(copy_container);
- }
- bt_ctf_field_type_put(copy);
- return NULL;
+ bt_put(copy_container);
+ BT_PUT(copy);
+ return copy;
}
static
end:
return copy;
error:
- bt_ctf_field_type_put(copy);
- return NULL;
+ BT_PUT(copy);
+ return copy;
}
static
}
}
end:
- if (copy_tag) {
- bt_ctf_field_type_put(copy_tag);
- }
-
+ bt_put(copy_tag);
return copy;
error:
- if (copy_tag) {
- bt_ctf_field_type_put(copy_tag);
- }
-
- bt_ctf_field_type_put(copy);
- return NULL;
+ bt_put(copy_tag);
+ BT_PUT(copy);
+ return copy;
}
static
parent);
copy_array->declaration = array->declaration;
end:
- if (copy_element) {
- bt_ctf_field_type_put(copy_element);
- }
-
+ bt_put(copy_element);
return copy;
}
}
}
end:
- if (copy_element) {
- bt_ctf_field_type_put(copy_element);
- }
-
+ bt_put(copy_element);
return copy;
error:
- if (copy) {
- bt_ctf_field_type_put(copy);
- copy = NULL;
- }
+ BT_PUT(copy);
goto end;
}