Fix: loading of live session within userspace domains
[lttng-tools.git] / src / common / config / session-config.c
index 87e9c03c8f667a65efee86dead199f77d7ee8884..48094c59a427f9636e5b222c09bd85c6b5c3a0d9 100644 (file)
@@ -95,17 +95,23 @@ const char * const config_element_output_type = "output_type";
 const char * const config_element_tracefile_size = "tracefile_size";
 const char * const config_element_tracefile_count = "tracefile_count";
 const char * const config_element_live_timer_interval = "live_timer_interval";
+LTTNG_HIDDEN const char * const config_element_discarded_events = "discarded_events";
+LTTNG_HIDDEN const char * const config_element_lost_packets = "lost_packets";
 const char * const config_element_type = "type";
 const char * const config_element_buffer_type = "buffer_type";
 const char * const config_element_session = "session";
 const char * const config_element_sessions = "sessions";
-const char * const config_element_perf = "perf";
+LTTNG_HIDDEN const char * const config_element_context_perf = "perf";
+LTTNG_HIDDEN const char * const config_element_context_app = "app";
+LTTNG_HIDDEN const char * const config_element_context_app_provider_name = "provider_name";
+LTTNG_HIDDEN const char * const config_element_context_app_ctx_name = "ctx_name";
 const char * const config_element_config = "config";
 const char * const config_element_started = "started";
 const char * const config_element_snapshot_mode = "snapshot_mode";
 const char * const config_element_loglevel = "loglevel";
 const char * const config_element_loglevel_type = "loglevel_type";
 const char * const config_element_filter = "filter";
+LTTNG_HIDDEN const char * const config_element_filter_expression = "filter_expression";
 const char * const config_element_snapshot_outputs = "snapshot_outputs";
 const char * const config_element_consumer_output = "consumer_output";
 const char * const config_element_destination = "destination";
@@ -165,6 +171,11 @@ const char * const config_event_context_pthread_id = "PTHREAD_ID";
 const char * const config_event_context_hostname = "HOSTNAME";
 const char * const config_event_context_ip = "IP";
 const char * const config_event_context_perf_thread_counter = "PERF_THREAD_COUNTER";
+LTTNG_HIDDEN const char * const config_event_context_app = "APP";
+LTTNG_HIDDEN const char * const config_event_context_interruptible = "INTERRUPTIBLE";
+LTTNG_HIDDEN const char * const config_event_context_preemptible = "PREEMPTIBLE";
+LTTNG_HIDDEN const char * const config_event_context_need_reschedule = "NEED_RESCHEDULE";
+LTTNG_HIDDEN const char * const config_event_context_migratable = "MIGRATABLE";
 
 struct consumer_output {
        int enabled;
@@ -449,7 +460,40 @@ int config_writer_open_element(struct config_writer *writer,
        ret = xmlTextWriterStartElement(writer->writer, encoded_element_name);
        xmlFree(encoded_element_name);
 end:
-       return ret > 0 ? 0 : ret;
+       return ret >= 0 ? 0 : ret;
+}
+
+LTTNG_HIDDEN
+int config_writer_write_attribute(struct config_writer *writer,
+               const char *name, const char *value)
+{
+       int ret;
+       xmlChar *encoded_name = NULL;
+       xmlChar *encoded_value = NULL;
+
+       if (!writer || !writer->writer || !name || !name[0]) {
+               ret = -1;
+               goto end;
+       }
+
+       encoded_name = encode_string(name);
+       if (!encoded_name) {
+               ret = -1;
+               goto end;
+       }
+
+       encoded_value = encode_string(value);
+       if (!encoded_value) {
+               ret = -1;
+               goto end;
+       }
+
+       ret = xmlTextWriterWriteAttribute(writer->writer, encoded_name,
+                       encoded_value);
+end:
+       xmlFree(encoded_name);
+       xmlFree(encoded_value);
+       return ret >= 0 ? 0 : ret;
 }
 
 LTTNG_HIDDEN
@@ -464,7 +508,7 @@ int config_writer_close_element(struct config_writer *writer)
 
        ret = xmlTextWriterEndElement(writer->writer);
 end:
-       return ret > 0 ? 0 : ret;
+       return ret >= 0 ? 0 : ret;
 }
 
 LTTNG_HIDDEN
@@ -489,7 +533,7 @@ int config_writer_write_element_unsigned_int(struct config_writer *writer,
                encoded_element_name, "%" PRIu64, value);
        xmlFree(encoded_element_name);
 end:
-       return ret > 0 ? 0 : ret;
+       return ret >= 0 ? 0 : ret;
 }
 
 LTTNG_HIDDEN
@@ -514,7 +558,7 @@ int config_writer_write_element_signed_int(struct config_writer *writer,
                encoded_element_name, "%" PRIi64, value);
        xmlFree(encoded_element_name);
 end:
-       return ret > 0 ? 0 : ret;
+       return ret >= 0 ? 0 : ret;
 }
 
 LTTNG_HIDDEN
@@ -556,7 +600,7 @@ int config_writer_write_element_string(struct config_writer *writer,
 end:
        xmlFree(encoded_element_name);
        xmlFree(encoded_value);
-       return ret > 0 ? 0 : ret;
+       return ret >= 0 ? 0 : ret;
 }
 
 static
@@ -946,6 +990,18 @@ int get_context_type(xmlChar *context_type)
        } else if (!strcmp((char *) context_type,
                config_event_context_ip)) {
                ret = LTTNG_EVENT_CONTEXT_IP;
+       } else if (!strcmp((char *) context_type,
+               config_event_context_interruptible)) {
+               ret = LTTNG_EVENT_CONTEXT_INTERRUPTIBLE;
+       } else if (!strcmp((char *) context_type,
+               config_event_context_preemptible)) {
+               ret = LTTNG_EVENT_CONTEXT_PREEMPTIBLE;
+       } else if (!strcmp((char *) context_type,
+               config_event_context_need_reschedule)) {
+               ret = LTTNG_EVENT_CONTEXT_NEED_RESCHEDULE;
+       } else if (!strcmp((char *) context_type,
+               config_event_context_migratable)) {
+               ret = LTTNG_EVENT_CONTEXT_MIGRATABLE;
        } else {
                goto error;
        }
@@ -1095,17 +1151,16 @@ end:
 }
 
 static
-int create_session_net_output(const char *name, struct lttng_domain *domain,
-       const char *control_uri, const char *data_uri)
+int create_session_net_output(const char *name, const char *control_uri,
+               const char *data_uri)
 {
        int ret;
        struct lttng_handle *handle;
        const char *uri = NULL;
 
        assert(name);
-       assert(domain);
 
-       handle = lttng_create_handle(name, domain);
+       handle = lttng_create_handle(name, NULL);
        if (!handle) {
                ret = -LTTNG_ERR_NOMEM;
                goto end;
@@ -1287,11 +1342,6 @@ int create_session(const char *name,
        }
 
        if (output.control_uri || output.data_uri) {
-               int i;
-               struct lttng_domain *domain;
-               struct lttng_domain *domains[] =
-                       { kernel_domain, ust_domain, jul_domain, log4j_domain };
-
                /* network destination */
                if (live_timer_interval && live_timer_interval != UINT64_MAX) {
                        /*
@@ -1307,18 +1357,12 @@ int create_session(const char *name,
                        goto end;
                }
 
-               for (i = 0; i < (sizeof(domains) / sizeof(domains[0])); i++) {
-                       domain = domains[i];
-                       if (!domain) {
-                               continue;
-                       }
-
-                       ret = create_session_net_output(name, domain, output.control_uri,
-                                       output.data_uri);
-                       if (ret) {
-                               goto end;
-                       }
+               ret = create_session_net_output(name, output.control_uri,
+                               output.data_uri);
+               if (ret) {
+                       goto end;
                }
+
        } else {
                /* either local output or no output */
                ret = lttng_create_session(name, output.path);
@@ -1991,6 +2035,7 @@ int process_context_node(xmlNodePtr context_node,
                config_element_type)) {
                /* type */
                xmlChar *content = xmlNodeGetContent(context_child_node);
+
                if (!content) {
                        ret = -LTTNG_ERR_NOMEM;
                        goto end;
@@ -2004,10 +2049,11 @@ int process_context_node(xmlNodePtr context_node,
                }
 
                context.ctx = ret;
-       } else {
+       } else if (!strcmp((const char *) context_child_node->name,
+               config_element_context_perf)) {
+               /* perf */
                xmlNodePtr perf_attr_node;
 
-               /* perf */
                context.ctx = handle->domain.type == LTTNG_DOMAIN_KERNEL ?
                        LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER :
                        LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER;
@@ -2085,9 +2131,41 @@ int process_context_node(xmlNodePtr context_node,
                                free(content);
                        }
                }
+       } else if (!strcmp((const char *) context_child_node->name,
+               config_element_context_app)) {
+               /* application context */
+               xmlNodePtr app_ctx_node;
+
+               context.ctx = LTTNG_EVENT_CONTEXT_APP_CONTEXT;
+               for (app_ctx_node = xmlFirstElementChild(context_child_node);
+                               app_ctx_node; app_ctx_node =
+                               xmlNextElementSibling(app_ctx_node)) {
+                       xmlChar *content;
+                       char **target = strcmp(
+                               (const char *) app_ctx_node->name,
+                               config_element_context_app_provider_name) == 0 ?
+                                       &context.u.app_ctx.provider_name :
+                                       &context.u.app_ctx.ctx_name;
+
+                       content = xmlNodeGetContent(app_ctx_node);
+                       if (!content) {
+                               ret = -LTTNG_ERR_NOMEM;
+                               goto end;
+                       }
+
+                       *target = (char *) content;
+               }
+       } else {
+               /* Unrecognized context type */
+               ret = -LTTNG_ERR_LOAD_INVALID_CONFIG;
+               goto end;
        }
 
        ret = lttng_add_context(handle, &context, NULL, channel_name);
+       if (context.ctx == LTTNG_EVENT_CONTEXT_APP_CONTEXT) {
+               free(context.u.app_ctx.provider_name);
+               free(context.u.app_ctx.ctx_name);
+       }
 end:
        return ret;
 }
This page took 0.027358 seconds and 4 git commands to generate.