-/* Create dynamically allocated types. */
-static inline
-struct lttng_ust_type_common *lttng_ust_create_type_integer(unsigned int size,
- unsigned short alignment, bool signedness, unsigned int byte_order,
- unsigned int base)
-{
- struct lttng_ust_type_integer *integer_type;
-
- integer_type = zmalloc(sizeof(struct lttng_ust_type_integer));
- if (!integer_type)
- return NULL;
- integer_type->parent.type = lttng_ust_type_integer;
- integer_type->struct_size = sizeof(struct lttng_ust_type_integer);
- integer_type->size = size;
- integer_type->alignment = alignment;
- integer_type->signedness = signedness;
- integer_type->reverse_byte_order = byte_order != BYTE_ORDER;
- integer_type->base = base;
- return (struct lttng_ust_type_common *) integer_type;
-}
-
-static inline
-struct lttng_ust_type_common *lttng_ust_create_type_array_text(unsigned int length)
-{
- struct lttng_ust_type_array *array_type;
-
- array_type = zmalloc(sizeof(struct lttng_ust_type_array));
- if (!array_type)
- return NULL;
- array_type->parent.type = lttng_ust_type_array;
- array_type->struct_size = sizeof(struct lttng_ust_type_array);
- array_type->length = length;
- array_type->alignment = 0;
- array_type->encoding = lttng_ust_string_encoding_UTF8;
- array_type->elem_type = lttng_ust_create_type_integer(sizeof(char) * CHAR_BIT,
- lttng_ust_rb_alignof(char) * CHAR_BIT, lttng_ust_is_signed_type(char),
- BYTE_ORDER, 10);
- if (!array_type->elem_type)
- goto error_elem;
- return (struct lttng_ust_type_common *) array_type;
-
-error_elem:
- free(array_type);
- return NULL;
-}
-
-/*
- * Destroy dynamically allocated types, including nested types.
- * For enumerations, it does not free the enumeration mapping description.
- */
-static inline
-void lttng_ust_destroy_type(struct lttng_ust_type_common *type)
-{
- if (!type)
- return;
-
- switch (type->type) {
- case lttng_ust_type_integer:
- case lttng_ust_type_string:
- case lttng_ust_type_float:
- case lttng_ust_type_dynamic:
- free(type);
- break;
- case lttng_ust_type_enum:
- {
- struct lttng_ust_type_enum *enum_type = (struct lttng_ust_type_enum *) type;
-
- lttng_ust_destroy_type(enum_type->container_type);
- free(enum_type);
- break;
- }
- case lttng_ust_type_array:
- {
- struct lttng_ust_type_array *array_type = (struct lttng_ust_type_array *) type;
-
- lttng_ust_destroy_type(array_type->elem_type);
- free(array_type);
- break;
- }
- case lttng_ust_type_sequence:
- {
- struct lttng_ust_type_sequence *sequence_type = (struct lttng_ust_type_sequence *) type;
-
- lttng_ust_destroy_type(sequence_type->elem_type);
- free(sequence_type);
- break;
- }
- case lttng_ust_type_struct:
- {
- struct lttng_ust_type_struct *struct_type = (struct lttng_ust_type_struct *) type;
- unsigned int i;
-
- for (i = 0; i < struct_type->nr_fields; i++)
- lttng_ust_destroy_type(struct_type->fields[i]->type);
- free(struct_type);
- break;
- }
- default:
- abort();
- }
-}
+#define lttng_ust_static_type_integer(_size, _alignment, _signedness, _byte_order, _base) \
+ ((const struct lttng_ust_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_type_integer, { \
+ .parent = { \
+ .type = lttng_ust_type_integer, \
+ }, \
+ .struct_size = sizeof(struct lttng_ust_type_integer), \
+ .size = (_size), \
+ .alignment = (_alignment), \
+ .signedness = (_signedness), \
+ .reverse_byte_order = (_byte_order) != BYTE_ORDER, \
+ .base = (_base), \
+ }))
+
+#define lttng_ust_static_type_array_text(_length) \
+ ((const struct lttng_ust_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_type_array, { \
+ .parent = { \
+ .type = lttng_ust_type_array, \
+ }, \
+ .struct_size = sizeof(struct lttng_ust_type_array), \
+ .length = (_length), \
+ .alignment = 0, \
+ .encoding = lttng_ust_string_encoding_UTF8, \
+ .elem_type = lttng_ust_static_type_integer(sizeof(char) * CHAR_BIT, \
+ lttng_ust_rb_alignof(char) * CHAR_BIT, lttng_ust_is_signed_type(char), \
+ BYTE_ORDER, 10), \
+ }))
+
+#define lttng_ust_static_event_field(_name, _type, _nowrite, _nofilter) \
+ __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_event_field, { \
+ .struct_size = sizeof(struct lttng_ust_event_field), \
+ .name = (_name), \
+ .type = (_type), \
+ .nowrite = (_nowrite), \
+ .nofilter = (_nofilter), \
+ })
+
+#define lttng_ust_static_ctx_field(_event_field, _get_size, _record, _get_value, _destroy, _priv) \
+ __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_ctx_field, { \
+ .event_field = (_event_field), \
+ .get_size = (_get_size), \
+ .record = (_record), \
+ .get_value = (_get_value), \
+ .destroy = (_destroy), \
+ .priv = (_priv), \
+ })