Named metadata can be used more than once in a single tracepoint, or many tracepoints can use it. It must be statedumped only once in a given session.
Signed-off-by: Geneviève Bastien <[email protected]> --- src/bin/lttng-sessiond/ust-metadata.c | 39 +++++++++++++++++++++++++++++++++++ src/bin/lttng-sessiond/ust-registry.c | 11 ++++++++++ src/bin/lttng-sessiond/ust-registry.h | 8 +++++++ 3 files changed, 58 insertions(+) diff --git a/src/bin/lttng-sessiond/ust-metadata.c b/src/bin/lttng-sessiond/ust-metadata.c index 87d21fc..8b904a8 100644 --- a/src/bin/lttng-sessiond/ust-metadata.c +++ b/src/bin/lttng-sessiond/ust-metadata.c @@ -316,6 +316,27 @@ int _lttng_one_metadata_statedump(struct ust_registry_session *session, { int ret = 0, i; + /* Check if the metadata was already dumped */ + if (session->dumped_named_metadata != 0) { + struct ust_dumped_metadata *dumped = session->dumped_named_metadata; + char *metadata_name; + switch (metadata->mtype) { + case ustctl_mtype_enum: + metadata_name = metadata->u.ctf_enum.name; + break; + default: + return -EINVAL; + } + do { + if (dumped->mtype == metadata->mtype) { + if (strcmp(dumped->name, metadata_name) == 0) { + return 0; + } + } + dumped = dumped->next; + } while (dumped); + } + switch (metadata->mtype) { case ustctl_mtype_enum: { @@ -362,6 +383,24 @@ int _lttng_one_metadata_statedump(struct ust_registry_session *session, return -EINVAL; } + /* Flag this metadata as dumped */ + struct ust_dumped_metadata *dumped; + dumped = zmalloc(sizeof(*dumped)); + if (!dumped) { + ret = -ENOMEM; + return ret; + } + dumped->mtype = metadata->mtype; + switch (metadata->mtype) { + case ustctl_mtype_enum: + strncpy(dumped->name, metadata->u.ctf_enum.name, LTTNG_UST_SYM_NAME_LEN); + break; + default: + return -EINVAL; + } + dumped->next = session->dumped_named_metadata; + session->dumped_named_metadata = dumped; + return ret; } diff --git a/src/bin/lttng-sessiond/ust-registry.c b/src/bin/lttng-sessiond/ust-registry.c index 00e1c26..25cd31d 100644 --- a/src/bin/lttng-sessiond/ust-registry.c +++ b/src/bin/lttng-sessiond/ust-registry.c @@ -568,6 +568,7 @@ int ust_registry_session_init(struct ust_registry_session **sessionp, session->uint64_t_alignment = uint64_t_alignment; session->long_alignment = long_alignment; session->byte_order = byte_order; + session->dumped_named_metadata = 0; session->channels = lttng_ht_new(0, LTTNG_HT_TYPE_U64); if (!session->channels) { @@ -630,4 +631,14 @@ void ust_registry_session_destroy(struct ust_registry_session *reg) } free(reg->metadata); + + /* Free all dumped metadata */ + if (reg->dumped_named_metadata) { + struct ust_dumped_metadata *dumped; + do { + dumped = reg->dumped_named_metadata; + reg->dumped_named_metadata = dumped->next; + free(dumped); + } while (reg->dumped_named_metadata); + } } diff --git a/src/bin/lttng-sessiond/ust-registry.h b/src/bin/lttng-sessiond/ust-registry.h index 183db0f..a6c7e6e 100644 --- a/src/bin/lttng-sessiond/ust-registry.h +++ b/src/bin/lttng-sessiond/ust-registry.h @@ -31,6 +31,12 @@ struct ust_app; +struct ust_dumped_metadata { + enum ustctl_metadata_types mtype; + char name[LTTNG_UST_SYM_NAME_LEN]; + struct ust_dumped_metadata *next; +}; + struct ust_registry_session { /* * With multiple writers and readers, use this lock to access the registry. @@ -75,6 +81,8 @@ struct ust_registry_session { * deletes its sessions. */ unsigned int metadata_closed; + /* The list of named metadata already dumped */ + struct ust_dumped_metadata *dumped_named_metadata; }; struct ust_registry_channel { -- 1.8.5.3 _______________________________________________ lttng-dev mailing list [email protected] http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
