----- 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

Reply via email to