Implement variant type
[lttng-modules.git] / lttng-events.c
index a5fe3e865c4f9e16444917901ca1a1c4b906457f..0c72015fd1a56edc79f4ef9e4106c8aa3745c48c 100644 (file)
@@ -1736,6 +1736,62 @@ int _lttng_struct_statedump(struct lttng_session *session,
        return ret;
 }
 
+/*
+ * Must be called with sessions_mutex held.
+ */
+static
+int _lttng_variant_type_statedump(struct lttng_session *session,
+               const struct lttng_type *type,
+               size_t nesting)
+{
+       int ret;
+       uint32_t i, nr_choices;
+
+       ret = print_tabs(session, nesting);
+       if (ret)
+               return ret;
+       ret = lttng_metadata_printf(session,
+               "variant <_%s> {\n",
+               type->u.variant.tag_name);
+       if (ret)
+               return ret;
+       nr_choices = type->u.variant.nr_choices;
+       for (i = 0; i < nr_choices; i++) {
+               const struct lttng_event_field *iter_field;
+
+               iter_field = &type->u.variant.choices[i];
+               ret = _lttng_field_statedump(session, iter_field, nesting + 1);
+               if (ret)
+                       return ret;
+       }
+       ret = print_tabs(session, nesting);
+       if (ret)
+               return ret;
+       ret = lttng_metadata_printf(session,
+               "}");
+       return ret;
+}
+
+/*
+ * Must be called with sessions_mutex held.
+ */
+static
+int _lttng_variant_statedump(struct lttng_session *session,
+               const struct lttng_event_field *field,
+               size_t nesting)
+{
+       int ret;
+
+       ret = _lttng_variant_type_statedump(session,
+                       &field->type, nesting);
+       if (ret)
+               return ret;
+       ret = lttng_metadata_printf(session,
+               "_%s;\n",
+               field->name);
+       return ret;
+}
+
 /*
  * Must be called with sessions_mutex held.
  */
@@ -1747,7 +1803,7 @@ int _lttng_array_compound_statedump(struct lttng_session *session,
        int ret;
        const struct lttng_type *elem_type;
 
-       /* Only array of structures are currently supported. */
+       /* Only array of structures and variants are currently supported. */
        elem_type = field->type.u.array_compound.elem_type;
        switch (elem_type->atype) {
        case atype_struct:
@@ -1755,6 +1811,11 @@ int _lttng_array_compound_statedump(struct lttng_session *session,
                if (ret)
                        return ret;
                break;
+       case atype_variant:
+               ret = _lttng_variant_type_statedump(session, elem_type, nesting);
+               if (ret)
+                       return ret;
+               break;
        default:
                return -EINVAL;
        }
@@ -1779,7 +1840,7 @@ int _lttng_sequence_compound_statedump(struct lttng_session *session,
 
        length_name = field->type.u.sequence_compound.length_name;
 
-       /* Only array of structures are currently supported. */
+       /* Only array of structures and variants are currently supported. */
        elem_type = field->type.u.sequence_compound.elem_type;
        switch (elem_type->atype) {
        case atype_struct:
@@ -1787,6 +1848,11 @@ int _lttng_sequence_compound_statedump(struct lttng_session *session,
                if (ret)
                        return ret;
                break;
+       case atype_variant:
+               ret = _lttng_variant_type_statedump(session, elem_type, nesting);
+               if (ret)
+                       return ret;
+               break;
        default:
                return -EINVAL;
        }
@@ -1962,6 +2028,9 @@ int _lttng_field_statedump(struct lttng_session *session,
        case atype_sequence_compound:
                ret = _lttng_sequence_compound_statedump(session, field, nesting);
                break;
+       case atype_variant:
+               ret = _lttng_variant_statedump(session, field, nesting);
+               break;
 
        default:
                WARN_ON_ONCE(1);
This page took 0.023939 seconds and 4 git commands to generate.