Fix: add a kernel context list to the channel
[lttng-tools.git] / src / bin / lttng-sessiond / kernel.c
index b6b24a5a2b2b426fc78845bb8ca4bf7b1f16770a..b997a4aeab6b7ac0aac7208fa82bacd6e964ce28 100644 (file)
@@ -37,7 +37,7 @@
  * Add context on a kernel channel.
  */
 int kernel_add_channel_context(struct ltt_kernel_channel *chan,
-               struct lttng_kernel_context *ctx)
+               struct ltt_kernel_context *ctx)
 {
        int ret;
 
@@ -45,7 +45,7 @@ int kernel_add_channel_context(struct ltt_kernel_channel *chan,
        assert(ctx);
 
        DBG("Adding context to channel %s", chan->channel->name);
-       ret = kernctl_add_context(chan->fd, ctx);
+       ret = kernctl_add_context(chan->fd, &ctx->ctx);
        if (ret < 0) {
                if (errno != EEXIST) {
                        PERROR("add context ioctl");
@@ -56,13 +56,7 @@ int kernel_add_channel_context(struct ltt_kernel_channel *chan,
                goto error;
        }
 
-       chan->ctx = zmalloc(sizeof(struct lttng_kernel_context));
-       if (chan->ctx == NULL) {
-               PERROR("zmalloc event context");
-               goto error;
-       }
-
-       memcpy(chan->ctx, ctx, sizeof(struct lttng_kernel_context));
+       cds_list_add_tail(&ctx->list, &chan->ctx_list);
 
        return 0;
 
@@ -201,6 +195,9 @@ int kernel_create_event(struct lttng_event *ev,
                case ENOSYS:
                        WARN("Event type not implemented");
                        break;
+               case ENOENT:
+                       WARN("Event %s not found!", ev->name);
+                       break;
                default:
                        PERROR("create event ioctl");
                }
@@ -759,11 +756,11 @@ void kernel_destroy_session(struct ltt_kernel_session *ksess)
        DBG("Tearing down kernel session");
 
        /*
-        * Destroy channels on the consumer if in no output mode because the
-        * streams are in *no* monitor mode so we have to send a command to clean
-        * them up or else they leaked.
+        * Destroy channels on the consumer if at least one FD has been sent and we
+        * are in no output mode because the streams are in *no* monitor mode so we
+        * have to send a command to clean them up or else they leaked.
         */
-       if (!ksess->output_traces) {
+       if (!ksess->output_traces && ksess->consumer_fds_sent) {
                int ret;
                struct consumer_socket *socket;
                struct lttng_ht_iter iter;
This page took 0.026873 seconds and 5 git commands to generate.