The metadata is dumped along with the event description, before the event
itself so that the metadata precedes it in the metadata file.

Signed-off-by: Geneviève Bastien <[email protected]>
---
 src/bin/lttng-sessiond/ust-metadata.c | 93 ++++++++++++++++++++++++++++++++++-
 1 file changed, 91 insertions(+), 2 deletions(-)

diff --git a/src/bin/lttng-sessiond/ust-metadata.c 
b/src/bin/lttng-sessiond/ust-metadata.c
index b0f83d2..87d21fc 100644
--- a/src/bin/lttng-sessiond/ust-metadata.c
+++ b/src/bin/lttng-sessiond/ust-metadata.c
@@ -180,6 +180,12 @@ int _lttng_field_statedump(struct ust_registry_session 
*session,
                        field->type.u.basic.integer.reverse_byte_order ? 
bo_reverse : bo_native,
                        field->name);
                break;
+       case ustctl_atype_enum:
+               ret = lttng_metadata_printf(session,
+                       "               enum __ust_enum__%s _%s;\n",
+                       field->type.u.basic.enumeration.name,
+                       field->name);
+               break;
        case ustctl_atype_float:
                ret = lttng_metadata_printf(session,
                        "               floating_point { exp_dig = %u; mant_dig 
= %u; align = %u;%s } _%s;\n",
@@ -189,8 +195,6 @@ int _lttng_field_statedump(struct ust_registry_session 
*session,
                        field->type.u.basic.integer.reverse_byte_order ? 
bo_reverse : bo_native,
                        field->name);
                break;
-       case ustctl_atype_enum:
-               return -EINVAL;
        case ustctl_atype_array:
        {
                const struct ustctl_basic_type *elem_type;
@@ -303,6 +307,86 @@ int _lttng_fields_metadata_statedump(struct 
ust_registry_session *session,
 }
 
 /*
+ * Dumps a named metadata to the metadata file for the session. It should
+ * verify whether this metadata was already dumped by a previous event.
+ */
+static
+int _lttng_one_metadata_statedump(struct ust_registry_session *session,
+               const struct ustctl_named_metadata *metadata)
+{
+       int ret = 0, i;
+
+       switch (metadata->mtype) {
+       case ustctl_mtype_enum:
+       {
+               const struct ustctl_enum *uenum;
+               uenum = &metadata->u.ctf_enum;
+               ret = lttng_metadata_printf(session,
+                       "enum __ust_enum__%s: integer { size = %u; align = %u; 
signed = %u; encoding = %s; base = %u; } {\n",
+                       uenum->name,
+                       uenum->container_type.size,
+                       uenum->container_type.alignment,
+                       uenum->container_type.signedness,
+                       (uenum->container_type.encoding == ustctl_encode_none)
+                               ? "none"
+                               : (uenum->container_type.encoding == 
ustctl_encode_UTF8)
+                                       ? "UTF8"
+                                       : "ASCII",
+                       uenum->container_type.base);
+               if (ret)
+                       return ret;
+               /* Dump the entries */
+               for (i = 0; i < uenum->len; i++) {
+                       struct ustctl_enum_entry entry;
+                       entry = uenum->entries[i];
+                       if (entry.start == entry.end) {
+                               ret = lttng_metadata_printf(session,
+                                               "       %s = %d,\n",
+                                               entry.string, entry.start);
+                               if (ret)
+                                       return ret;
+                       } else {
+                               ret = lttng_metadata_printf(session,
+                                               "       %s = %d ... %d,\n",
+                                               entry.string, entry.start, 
entry.end);
+                               if (ret)
+                                       return ret;
+                       }
+               }
+               ret = lttng_metadata_printf(session, "};\n\n");
+               if (ret)
+                       return ret;
+               break;
+       }
+       default:
+               return -EINVAL;
+       }
+
+       return ret;
+}
+
+/*
+ * This function dumps to the metadata the named metadata used by the
+ * event.
+ */
+static
+int _lttng_named_metadata_statedump(struct ust_registry_session *session,
+               struct ust_registry_event *event)
+{
+       int ret = 0;
+       int i;
+
+       for (i = 0; i < event->nr_metadata; i++) {
+               const struct ustctl_named_metadata *metadata = 
&event->named_metadata[i];
+
+               ret = _lttng_one_metadata_statedump(session, metadata);
+               if (ret)
+                       return ret;
+       }
+       return ret;
+}
+
+/*
  * Should be called with session registry mutex held.
  */
 int ust_metadata_event_statedump(struct ust_registry_session *session,
@@ -315,6 +399,11 @@ int ust_metadata_event_statedump(struct 
ust_registry_session *session,
        if (chan->chan_id == -1U)
                return 0;
 
+       /* Dump the named_metadata needed by this event */
+       ret = _lttng_named_metadata_statedump(session, event);
+       if (ret)
+               goto end;
+
        ret = lttng_metadata_printf(session,
                "event {\n"
                "       name = \"%s\";\n"
-- 
1.8.5.3


_______________________________________________
lttng-dev mailing list
[email protected]
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to