Fix: Teardown of thread_manage_clients on failure of listen/create_poll
[lttng-tools.git] / src / bin / lttng-sessiond / cmd.c
index 184dd494c74cfa29fe3408da36f94085df91b3ca..46a758e27eab8f9b01c502256bde42a60b32702d 100644 (file)
@@ -939,12 +939,23 @@ error:
  * Command LTTNG_ADD_CONTEXT processed by the client thread.
  */
 int cmd_add_context(struct ltt_session *session, int domain,
-               char *channel_name, char *event_name, struct lttng_event_context *ctx)
+               char *channel_name, char *event_name, struct lttng_event_context *ctx,
+               int kwpipe)
 {
        int ret;
 
        switch (domain) {
        case LTTNG_DOMAIN_KERNEL:
+               assert(session->kernel_session);
+
+               if (session->kernel_session->channel_count == 0) {
+                       /* Create default channel */
+                       ret = channel_kernel_create(session->kernel_session, NULL, kwpipe);
+                       if (ret != LTTNG_OK) {
+                               goto error;
+                       }
+               }
+
                /* Add kernel context to kernel tracer */
                ret = context_kernel_add(session->kernel_session, ctx,
                                event_name, channel_name);
@@ -955,9 +966,28 @@ int cmd_add_context(struct ltt_session *session, int domain,
        case LTTNG_DOMAIN_UST:
        {
                struct ltt_ust_session *usess = session->ust_session;
-
                assert(usess);
 
+               unsigned int chan_count =
+                       lttng_ht_get_count(usess->domain_global.channels);
+               if (chan_count == 0) {
+                       struct lttng_channel *attr;
+                       /* Create default channel */
+                       attr = channel_new_default_attr(domain);
+                       if (attr == NULL) {
+                               ret = LTTNG_ERR_FATAL;
+                               goto error;
+                       }
+
+                       ret = channel_ust_create(usess, domain, attr);
+                       if (ret != LTTNG_OK) {
+                               free(attr);
+                               goto error;
+                       }
+                       free(attr);
+               }
+
+
                ret = context_ust_add(usess, domain, ctx, event_name, channel_name);
                if (ret != LTTNG_OK) {
                        goto error;
@@ -2319,10 +2349,10 @@ error:
 }
 
 /*
- * Command LTTNG_DATA_AVAILABLE returning 0 if the data is NOT ready to be read
- * or else 1 if the data is available for trace analysis.
+ * Command LTTNG_DATA_PENDING returning 0 if the data is NOT pending meaning
+ * ready for trace analysis (or anykind of reader) or else 1 for pending data.
  */
-int cmd_data_available(struct ltt_session *session)
+int cmd_data_pending(struct ltt_session *session)
 {
        int ret;
        struct ltt_kernel_session *ksess = session->kernel_session;
@@ -2337,23 +2367,23 @@ int cmd_data_available(struct ltt_session *session)
        }
 
        if (ksess && ksess->consumer) {
-               ret = consumer_is_data_available(ksess->id, ksess->consumer);
-               if (ret == 0) {
+               ret = consumer_is_data_pending(ksess->id, ksess->consumer);
+               if (ret == 1) {
                        /* Data is still being extracted for the kernel. */
                        goto error;
                }
        }
 
        if (usess && usess->consumer) {
-               ret = consumer_is_data_available(usess->id, usess->consumer);
-               if (ret == 0) {
+               ret = consumer_is_data_pending(usess->id, usess->consumer);
+               if (ret == 1) {
                        /* Data is still being extracted for the kernel. */
                        goto error;
                }
        }
 
        /* Data is ready to be read by a viewer */
-       ret = 1;
+       ret = 0;
 
 error:
        return ret;
This page took 0.024924 seconds and 4 git commands to generate.