X-Git-Url: https://git.efficios.com/?a=blobdiff_plain;f=src%2Fcommon%2Fconfig%2Fsession-config.cpp;fp=src%2Fcommon%2Fconfig%2Fsession-config.cpp;h=351c7f921db7fe2389fd00f685a095c49d6b9979;hb=026a8516dce445ce5a6fa00fbd5e62118a5a8060;hp=f9d9d0eca558973a1e649bd4281d2572f9795bd2;hpb=46367c2a25601581792cdf6c04c600756ca0c78e;p=deliverable%2Flttng-tools.git diff --git a/src/common/config/session-config.cpp b/src/common/config/session-config.cpp index f9d9d0eca..351c7f921 100644 --- a/src/common/config/session-config.cpp +++ b/src/common/config/session-config.cpp @@ -1154,9 +1154,10 @@ end: return ret; } -static -int create_snapshot_session(const char *session_name, xmlNodePtr output_node, - const struct config_load_session_override_attr *overrides) +static int create_snapshot_session(const char *session_name, + xmlNodePtr output_node, + const struct config_load_session_override_attr *overrides, + const struct lttng_trace_format_descriptor *trace_format_descriptor) { int ret; enum lttng_error_code ret_code; @@ -1178,6 +1179,16 @@ int create_snapshot_session(const char *session_name, xmlNodePtr output_node, goto end; } + if (trace_format_descriptor != nullptr) { + enum lttng_session_descriptor_status s_status; + s_status = lttng_session_descriptor_set_trace_format_descriptor( + session_descriptor, trace_format_descriptor); + if (s_status != LTTNG_SESSION_DESCRIPTOR_STATUS_OK) { + ret = -LTTNG_ERR_FATAL; + goto end; + } + } + ret_code = lttng_create_session_ext(session_descriptor); if (ret_code != LTTNG_OK) { ret = -ret_code; @@ -1313,11 +1324,11 @@ end: return ret; } -static -int create_session(const char *name, - xmlNodePtr output_node, - uint64_t live_timer_interval, - const struct config_load_session_override_attr *overrides) +static int create_session(const char *name, + xmlNodePtr output_node, + uint64_t live_timer_interval, + const struct config_load_session_override_attr *overrides, + const struct lttng_trace_format_descriptor *trace_format_descriptor) { int ret = 0; enum lttng_error_code ret_code; @@ -1408,6 +1419,16 @@ int create_session(const char *name, goto end; } + if (trace_format_descriptor != nullptr) { + enum lttng_session_descriptor_status s_status; + s_status = lttng_session_descriptor_set_trace_format_descriptor( + session_descriptor, trace_format_descriptor); + if (s_status != LTTNG_SESSION_DESCRIPTOR_STATUS_OK) { + ret = -LTTNG_ERR_FATAL; + goto end; + } + } + ret_code = lttng_create_session_ext(session_descriptor); if (ret_code != LTTNG_OK) { ret = -ret_code; @@ -3261,6 +3282,49 @@ end: return ret; } +/* TODO: this could most probably be moved to a similar scheme to create_from_buffer/payload for the + * lttng::trace_format_descriptor object */ +static int process_trace_format_descriptor_node(xmlNodePtr trace_format_descriptor_node, + struct lttng_trace_format_descriptor **descriptor) +{ + int ret; + xmlNodePtr node; + struct lttng_trace_format_descriptor *local_descriptor = nullptr; + struct lttng_trace_format_descriptor *(*constructor)(void) = nullptr; + + for (node = xmlFirstElementChild(trace_format_descriptor_node); node; + node = xmlNextElementSibling(node)) { + if (!strcmp((const char *) node->name, config_element_session_trace_format_ctf1)) { + constructor = lttng_trace_format_ctf_1_descriptor_create; + break; + } else if (!strcmp((const char *) node->name, + config_element_session_trace_format_ctf2)) { + constructor = lttng_trace_format_ctf_2_descriptor_create; + break; + } + } + + if (constructor == nullptr) { + ret = -LTTNG_ERR_LOAD_INVALID_CONFIG; + goto end; + } + + local_descriptor = constructor(); + + if (local_descriptor == nullptr) { + ret = -LTTNG_ERR_NOMEM; + goto end; + } + + *descriptor = local_descriptor; + local_descriptor = nullptr; + ret = 0; + +end: + lttng_trace_format_descriptor_destroy(local_descriptor); + return ret; +} + static int process_session_node(xmlNodePtr session_node, const char *session_name, int overwrite, @@ -3281,6 +3345,7 @@ int process_session_node(xmlNodePtr session_node, const char *session_name, struct lttng_domain *jul_domain = NULL; struct lttng_domain *log4j_domain = NULL; struct lttng_domain *python_domain = NULL; + struct lttng_trace_format_descriptor *trace_format_descriptor = nullptr; for (node = xmlFirstElementChild(session_node); node; node = xmlNextElementSibling(node)) { @@ -3327,6 +3392,13 @@ int process_session_node(xmlNodePtr session_node, const char *session_name, } shm_path = node_content; + } else if (!trace_format_descriptor && + !strcmp((const char *) node->name, + config_element_session_trace_format)) { + ret = process_trace_format_descriptor_node(node, &trace_format_descriptor); + if (ret) { + goto error; + } } else { /* * attributes, snapshot_mode, live_timer_interval, rotation_size, @@ -3482,16 +3554,16 @@ domain_init_error: /* Create session type depending on output type */ if (snapshot_mode && snapshot_mode != -1) { - ret = create_snapshot_session((const char *) name, output_node, - overrides); + ret = create_snapshot_session((const char *) name, output_node, overrides, + trace_format_descriptor); } else if (live_timer_interval && live_timer_interval != UINT64_MAX) { - ret = create_session((const char *) name, - output_node, live_timer_interval, overrides); + ret = create_session((const char *) name, output_node, live_timer_interval, + overrides, trace_format_descriptor); } else { /* regular session */ - ret = create_session((const char *) name, - output_node, UINT64_MAX, overrides); + ret = create_session((const char *) name, output_node, UINT64_MAX, overrides, + trace_format_descriptor); } if (ret) { goto error; @@ -3543,6 +3615,7 @@ end: } error: + lttng_trace_format_descriptor_destroy(trace_format_descriptor); free(kernel_domain); free(ust_domain); free(jul_domain);