Fix: reference counting of consumer output
[lttng-tools.git] / src / bin / lttng-sessiond / trace-kernel.c
index a5c215fae98a068f359c0bf182e307a693dc9244..9b4fc9015501b08b3aca97db1319ae003c201b4d 100644 (file)
@@ -108,14 +108,6 @@ struct ltt_kernel_session *trace_kernel_create_session(void)
                goto error;
        }
 
-       /*
-        * The tmp_consumer stays NULL until a set_consumer_uri command is
-        * executed. At this point, the consumer should be nullify until an
-        * enable_consumer command. This assignment is symbolic since we've zmalloc
-        * the struct.
-        */
-       lks->tmp_consumer = NULL;
-
        return lks;
 
 error:
@@ -165,10 +157,10 @@ struct ltt_kernel_channel *trace_kernel_create_channel(
        lkc->stream_count = 0;
        lkc->event_count = 0;
        lkc->enabled = 1;
-       lkc->ctx = NULL;
        /* Init linked list */
        CDS_INIT_LIST_HEAD(&lkc->events_list.head);
        CDS_INIT_LIST_HEAD(&lkc->stream_list.head);
+       CDS_INIT_LIST_HEAD(&lkc->ctx_list);
 
        return lkc;
 
@@ -176,6 +168,32 @@ error:
        return NULL;
 }
 
+/*
+ * Allocate and init a kernel context object.
+ *
+ * Return the allocated object or NULL on error.
+ */
+struct ltt_kernel_context *trace_kernel_create_context(
+               struct lttng_kernel_context *ctx)
+{
+       struct ltt_kernel_context *kctx;
+
+       kctx = zmalloc(sizeof(*kctx));
+       if (!kctx) {
+               PERROR("zmalloc kernel context");
+               goto error;
+       }
+
+       if (ctx) {
+               memcpy(&kctx->ctx, ctx, sizeof(kctx->ctx));
+       }
+
+       CDS_INIT_LIST_HEAD(&kctx->list);
+
+error:
+       return kctx;
+}
+
 /*
  * Allocate and initialize a kernel event. Set name and event type.
  *
@@ -307,7 +325,7 @@ struct ltt_kernel_stream *trace_kernel_create_stream(const char *name,
        }
 
        /* Set name */
-       ret = snprintf(lks->name, sizeof(lks->name), "%s_%d", name, count);
+       ret = snprintf(lks->name, sizeof(lks->name), "%s_%u", name, count);
        if (ret < 0) {
                PERROR("snprintf stream name");
                goto error;
@@ -375,6 +393,17 @@ void trace_kernel_destroy_event(struct ltt_kernel_event *event)
        free(event);
 }
 
+/*
+ * Cleanup kernel context structure.
+ */
+void trace_kernel_destroy_context(struct ltt_kernel_context *ctx)
+{
+       assert(ctx);
+
+       cds_list_del(&ctx->list);
+       free(ctx);
+}
+
 /*
  * Cleanup kernel channel structure.
  */
@@ -382,6 +411,7 @@ void trace_kernel_destroy_channel(struct ltt_kernel_channel *channel)
 {
        struct ltt_kernel_stream *stream, *stmp;
        struct ltt_kernel_event *event, *etmp;
+       struct ltt_kernel_context *ctx, *ctmp;
        int ret;
 
        assert(channel);
@@ -405,11 +435,15 @@ void trace_kernel_destroy_channel(struct ltt_kernel_channel *channel)
                trace_kernel_destroy_event(event);
        }
 
+       /* For each context in the channel list */
+       cds_list_for_each_entry_safe(ctx, ctmp, &channel->ctx_list, list) {
+               trace_kernel_destroy_context(ctx);
+       }
+
        /* Remove from channel list */
        cds_list_del(&channel->list);
 
        free(channel->channel);
-       free(channel->ctx);
        free(channel);
 }
 
@@ -473,8 +507,7 @@ void trace_kernel_destroy_session(struct ltt_kernel_session *session)
        }
 
        /* Wipe consumer output object */
-       consumer_destroy_output(session->consumer);
-       consumer_destroy_output(session->tmp_consumer);
+       consumer_output_put(session->consumer);
 
        free(session);
 }
This page took 0.025157 seconds and 4 git commands to generate.