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;
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;
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;
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;
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,
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)) {
}
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,
/* 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;
}
error:
+ lttng_trace_format_descriptor_destroy(trace_format_descriptor);
free(kernel_domain);
free(ust_domain);
free(jul_domain);