X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=lttng-events.c;h=0c72015fd1a56edc79f4ef9e4106c8aa3745c48c;hb=65c85aa61984217039857513bbe988036f371693;hp=a5fe3e865c4f9e16444917901ca1a1c4b906457f;hpb=114667d5aa4ec11334787e04a9f90fe9184fc16f;p=lttng-modules.git diff --git a/lttng-events.c b/lttng-events.c index a5fe3e86..0c72015f 100644 --- a/lttng-events.c +++ b/lttng-events.c @@ -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);