----- Original Message ----- > From: "Geneviève Bastien" <[email protected]> > To: [email protected] > Sent: Friday, January 24, 2014 3:04:43 PM > Subject: [lttng-dev] [Patch LTTng-ust 5/7] Send and receive serialized > metadata for CTF named enumerations > > Updates the functions used for the communication between UST and the session > daemon so that named metadata can be sent and received. The description of > the > metadata follows the event that use them.
Looks good! Thanks! Acked-by: Mathieu Desnoyers <[email protected]> > The extra fields for each metadata > follow the descriptions of all metadata. > > Signed-off-by: Geneviève Bastien <[email protected]> > --- > include/lttng/ust-ctl.h | 4 +- > include/ust-comm.h | 8 ++- > liblttng-ust-comm/lttng-ust-comm.c | 110 > ++++++++++++++++++++++++++++++++----- > liblttng-ust-ctl/ustctl.c | 74 ++++++++++++++++++++++++- > liblttng-ust/lttng-events.c | 4 +- > 5 files changed, 181 insertions(+), 19 deletions(-) > > diff --git a/include/lttng/ust-ctl.h b/include/lttng/ust-ctl.h > index 29c89fe..1c82111 100644 > --- a/include/lttng/ust-ctl.h > +++ b/include/lttng/ust-ctl.h > @@ -421,7 +421,9 @@ int ustctl_recv_register_event(int sock, > */ > size_t *nr_fields, > struct ustctl_field **fields, > - char **model_emf_uri); > + char **model_emf_uri, > + size_t *nr_metadata, > + struct ustctl_named_metadata **named_metadata); > > /* > * Returns 0 on success, negative error value on error. > diff --git a/include/ust-comm.h b/include/ust-comm.h > index b9bbb39..40ba09b 100644 > --- a/include/ust-comm.h > +++ b/include/ust-comm.h > @@ -49,6 +49,7 @@ > #define LTTNG_UST_COMM_REG_MSG_PADDING 64 > > struct lttng_event_field; > +struct lttng_named_metadata; > struct lttng_ctx_field; > > struct ustctl_reg_msg { > @@ -127,7 +128,7 @@ struct ustcomm_notify_hdr { > uint32_t notify_cmd; > } LTTNG_PACKED; > > -#define USTCOMM_NOTIFY_EVENT_MSG_PADDING 32 > +#define USTCOMM_NOTIFY_EVENT_MSG_PADDING 28 > struct ustcomm_notify_event_msg { > uint32_t session_objd; > uint32_t channel_objd; > @@ -136,6 +137,7 @@ struct ustcomm_notify_event_msg { > uint32_t signature_len; > uint32_t fields_len; > uint32_t model_emf_uri_len; > + uint32_t metadata_len; > char padding[USTCOMM_NOTIFY_EVENT_MSG_PADDING]; > /* followed by signature, fields, and model_emf_uri */ > } LTTNG_PACKED; > @@ -221,7 +223,9 @@ int ustcomm_register_event(int sock, > size_t nr_fields, /* fields */ > const struct lttng_event_field *fields, > const char *model_emf_uri, > - uint32_t *id); /* event id (output) */ > + uint32_t *id, /* event id (output) */ > + size_t nr_metadata, > + const struct lttng_named_metadata *lttng_metadata); /* named metadata */ > > /* > * Returns 0 on success, negative error value on error. > diff --git a/liblttng-ust-comm/lttng-ust-comm.c > b/liblttng-ust-comm/lttng-ust-comm.c > index 1744b9f..33620fc 100644 > --- a/liblttng-ust-comm/lttng-ust-comm.c > +++ b/liblttng-ust-comm/lttng-ust-comm.c > @@ -1012,7 +1012,9 @@ int ustcomm_register_event(int sock, > size_t nr_fields, /* fields */ > const struct lttng_event_field *lttng_fields, > const char *model_emf_uri, > - uint32_t *id) /* event id (output) */ > + uint32_t *id, /* event id (output) */ > + size_t nr_metadata, > + const struct lttng_named_metadata *lttng_metadata) /* named metadata */ > { > ssize_t len; > struct { > @@ -1023,10 +1025,12 @@ int ustcomm_register_event(int sock, > struct ustcomm_notify_hdr header; > struct ustcomm_notify_event_reply r; > } reply; > - size_t signature_len, fields_len, model_emf_uri_len; > + size_t signature_len, fields_len, model_emf_uri_len, metadata_len; > struct ustctl_field *fields = NULL; > + struct ustctl_named_metadata *metadata = NULL; > size_t nr_write_fields = 0; > - int ret; > + size_t nr_write_metadata = 0; > + int ret, i; > > memset(&msg, 0, sizeof(msg)); > msg.header.notify_cmd = USTCTL_NOTIFY_CMD_EVENT; > @@ -1054,14 +1058,26 @@ int ustcomm_register_event(int sock, > model_emf_uri_len = 0; > } > msg.m.model_emf_uri_len = model_emf_uri_len; > + /* Calculate metadata len, serialize metadata. */ > + if (nr_metadata > 0) { > + ret = serialize_metadata(&nr_write_metadata, &metadata, > + nr_metadata, lttng_metadata); > + if (ret) { > + free(fields); > + return ret; > + } > + } > + metadata_len = sizeof(*metadata) * nr_write_metadata; > + msg.m.metadata_len = metadata_len; > + > len = ustcomm_send_unix_sock(sock, &msg, sizeof(msg)); > if (len > 0 && len != sizeof(msg)) { > - free(fields); > - return -EIO; > + ret = -EIO; > + goto error_fields; > } > if (len < 0) { > - free(fields); > - return len; > + ret = len; > + goto error_fields; > } > > /* send signature */ > @@ -1080,10 +1096,12 @@ int ustcomm_register_event(int sock, > len = ustcomm_send_unix_sock(sock, fields, fields_len); > free(fields); > if (len > 0 && len != fields_len) { > - return -EIO; > + ret = -EIO; > + goto error_metadata; > } > if (len < 0) { > - return len; > + ret = len; > + goto error_metadata; > } > } else { > free(fields); > @@ -1093,10 +1111,57 @@ int ustcomm_register_event(int sock, > /* send model_emf_uri */ > len = ustcomm_send_unix_sock(sock, model_emf_uri, > model_emf_uri_len); > - if (len > 0 && len != model_emf_uri_len) > - return -EIO; > - if (len < 0) > - return len; > + if (len > 0 && len != model_emf_uri_len) { > + ret = -EIO; > + goto error_metadata; > + } > + if (len < 0) { > + ret = len; > + goto error_metadata; > + } > + } > + > + /* Send metadata */ > + if (metadata_len > 0) { > + len = ustcomm_send_unix_sock(sock, metadata, metadata_len); > + DBG("Sending named metadata for event %s.\n", event_name); > + if (len > 0 && len != metadata_len) { > + goto error_metadata; > + } > + if (len < 0) { > + goto error_metadata; > + } > + /* Send extra metadata information */ > + for (i = 0; i < nr_write_metadata; i++) { > + struct ustctl_named_metadata *one_metadata; > + one_metadata = &metadata[i]; > + > + switch (one_metadata->mtype) { > + case ustctl_mtype_enum: > + { > + int entry_len = one_metadata->u.ctf_enum.len * > sizeof(*one_metadata->u.ctf_enum.entries); > + DBG("Sending entries for enum metadata %s.\n", > + one_metadata->u.ctf_enum.name); > + /* Send the entries */ > + len = ustcomm_send_unix_sock(sock, > one_metadata->u.ctf_enum.entries, > entry_len); > + free(one_metadata->u.ctf_enum.entries); > + one_metadata->u.ctf_enum.entries = NULL; > + if (len > 0 && len != entry_len) { > + goto error_metadata; > + } > + if (len < 0) { > + goto error_metadata; > + } > + break; > + } > + default: > + break; > + } > + } > + free(metadata); > + > + } else { > + free(metadata); > } > > /* receive reply */ > @@ -1130,6 +1195,25 @@ int ustcomm_register_event(int sock, > return len; > } > } > + > +error_fields: > + free(fields); > +error_metadata: > + /* First free dynamically allocated content in metadata */ > + for (i = 0; i < nr_write_metadata; i++) { > + struct ustctl_named_metadata *one_metadata; > + one_metadata = &metadata[i]; > + > + switch (one_metadata->mtype) { > + case ustctl_mtype_enum: > + free(one_metadata->u.ctf_enum.entries); > + break; > + default: > + break; > + } > + } > + free(metadata); > + return ret; > } > > /* > diff --git a/liblttng-ust-ctl/ustctl.c b/liblttng-ust-ctl/ustctl.c > index 00d9802..9f8ca87 100644 > --- a/liblttng-ust-ctl/ustctl.c > +++ b/liblttng-ust-ctl/ustctl.c > @@ -1724,13 +1724,17 @@ int ustctl_recv_register_event(int sock, > char **signature, > size_t *nr_fields, > struct ustctl_field **fields, > - char **model_emf_uri) > + char **model_emf_uri, > + size_t *nr_metadata, > + struct ustctl_named_metadata **named_metadata) > { > ssize_t len; > struct ustcomm_notify_event_msg msg; > - size_t signature_len, fields_len, model_emf_uri_len; > + size_t signature_len, fields_len, model_emf_uri_len, metadata_len; > char *a_sign = NULL, *a_model_emf_uri = NULL; > struct ustctl_field *a_fields = NULL; > + struct ustctl_named_metadata *a_metadata = NULL; > + int i; > > len = ustcomm_recv_unix_sock(sock, &msg, sizeof(msg)); > if (len > 0 && len != sizeof(msg)) > @@ -1754,6 +1758,12 @@ int ustctl_recv_register_event(int sock, > > model_emf_uri_len = msg.model_emf_uri_len; > > + metadata_len = msg.metadata_len; > + > + if (metadata_len % sizeof(*a_metadata) != 0) { > + return -EINVAL; > + } > + > /* recv signature. contains at least \0. */ > a_sign = zmalloc(signature_len); > if (!a_sign) > @@ -1818,13 +1828,73 @@ int ustctl_recv_register_event(int sock, > a_model_emf_uri[model_emf_uri_len - 1] = '\0'; > } > > + /* recv metadata */ > + if (metadata_len) { > + a_metadata = zmalloc(metadata_len); > + if (!a_metadata) { > + len = -ENOMEM; > + goto signature_error; > + } > + len = ustcomm_recv_unix_sock(sock, a_metadata, metadata_len); > + DBG("Received named metadata for event %s.\n", event_name); > + if (len > 0 && len != metadata_len) { > + len = -EIO; > + goto metadata_error; > + } > + if (len == 0) { > + len = -EPIPE; > + goto metadata_error; > + } > + if (len < 0) { > + goto metadata_error; > + } > + /* Receive extra metadata information */ > + for (i = 0; i < metadata_len / sizeof(*a_metadata); i++) { > + struct ustctl_named_metadata *one_metadata; > + one_metadata = &a_metadata[i]; > + > + switch (one_metadata->mtype) { > + case ustctl_mtype_enum: > + { > + int entry_len = one_metadata->u.ctf_enum.len * > sizeof(*one_metadata->u.ctf_enum.entries); > + /* Send the entries */ > + one_metadata->u.ctf_enum.entries = > zmalloc(entry_len); > + if (!one_metadata->u.ctf_enum.entries) { > + len = -ENOMEM; > + goto metadata_error; > + } > + len = ustcomm_recv_unix_sock(sock, > one_metadata->u.ctf_enum.entries, > entry_len); > + DBG("Received entries for enum %s.\n", > one_metadata->u.ctf_enum.name); > + if (len > 0 && len != entry_len) { > + len = -EIO; > + goto metadata_error; > + } > + if (len == 0) { > + len = -EPIPE; > + goto metadata_error; > + } > + if (len < 0) { > + goto metadata_error; > + } > + break; > + } > + default: > + break; > + } > + } > + } > + > *signature = a_sign; > *nr_fields = fields_len / sizeof(*a_fields); > *fields = a_fields; > *model_emf_uri = a_model_emf_uri; > + *nr_metadata = metadata_len / sizeof(*a_metadata); > + *named_metadata = a_metadata; > > return 0; > > +metadata_error: > + free(a_metadata); > model_error: > free(a_model_emf_uri); > fields_error: > diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c > index 6e16cf2..26a4427 100644 > --- a/liblttng-ust/lttng-events.c > +++ b/liblttng-ust/lttng-events.c > @@ -430,7 +430,9 @@ int lttng_event_create(const struct lttng_event_desc > *desc, > desc->nr_fields, > desc->fields, > uri, > - &event->id); > + &event->id, > + desc->u.ext.nr_metadata, > + desc->u.ext.named_metadata); > if (ret < 0) { > DBG("Error (%d) registering event to sessiond", ret); > goto sessiond_register_error; > -- > 1.8.5.3 > > > _______________________________________________ > lttng-dev mailing list > [email protected] > http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev > -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com _______________________________________________ lttng-dev mailing list [email protected] http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
