X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Ftrace-ust.c;h=4c7dac8b72111f33904e7fef69a53e77578171cb;hp=8cc1b59158ddfc3f840b73a6409f906029e5625c;hb=178191b3899f114001f000c2e7f46909969f9c6f;hpb=d14d33bf091e72b23b1f90ea18a0a01bed098b76 diff --git a/src/bin/lttng-sessiond/trace-ust.c b/src/bin/lttng-sessiond/trace-ust.c index 8cc1b5915..4c7dac8b7 100644 --- a/src/bin/lttng-sessiond/trace-ust.c +++ b/src/bin/lttng-sessiond/trace-ust.c @@ -85,8 +85,8 @@ error: * * Return pointer to structure or NULL. */ -struct ltt_ust_session *trace_ust_create_session(char *path, int session_id, - struct lttng_domain *domain) +struct ltt_ust_session *trace_ust_create_session(char *path, + unsigned int session_id, struct lttng_domain *domain) { int ret; struct ltt_ust_session *lus; @@ -109,18 +109,47 @@ struct ltt_ust_session *trace_ust_create_session(char *path, int session_id, /* Alloc UST global domain channels' HT */ lus->domain_global.channels = lttng_ht_new(0, LTTNG_HT_TYPE_STRING); - /* Set session path */ - ret = snprintf(lus->pathname, PATH_MAX, "%s/ust", path); - if (ret < 0) { - PERROR("snprintf kernel traces path"); - goto error_free_session; + lus->consumer = consumer_create_output(CONSUMER_DST_LOCAL); + if (lus->consumer == NULL) { + goto error_consumer; + } + + /* + * 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. + */ + lus->tmp_consumer = NULL; + + /* Use the default consumer output which is the tracing session path. */ + if (path && strlen(path) > 0) { + ret = snprintf(lus->consumer->dst.trace_path, PATH_MAX, + "%s" DEFAULT_UST_TRACE_DIR, path); + if (ret < 0) { + PERROR("snprintf UST consumer trace path"); + goto error_path; + } + + /* Set session path */ + ret = snprintf(lus->pathname, PATH_MAX, "%s" DEFAULT_UST_TRACE_DIR, + path); + if (ret < 0) { + PERROR("snprintf kernel traces path"); + goto error_path; + } } DBG2("UST trace session create successful"); return lus; -error_free_session: +error_path: + consumer_destroy_output(lus->consumer); +error_consumer: + lttng_ht_destroy(lus->domain_global.channels); + lttng_ht_destroy(lus->domain_exec); + lttng_ht_destroy(lus->domain_pid); free(lus); error: return NULL; @@ -149,7 +178,7 @@ struct ltt_ust_channel *trace_ust_create_channel(struct lttng_channel *chan, luc->attr.num_subbuf = chan->attr.num_subbuf; luc->attr.switch_timer_interval = chan->attr.switch_timer_interval; luc->attr.read_timer_interval = chan->attr.read_timer_interval; - luc->attr.output = chan->attr.output; + luc->attr.output = (enum lttng_ust_output) chan->attr.output; /* Translate to UST output enum */ switch (luc->attr.output) { @@ -180,6 +209,8 @@ struct ltt_ust_channel *trace_ust_create_channel(struct lttng_channel *chan, return luc; error_free_channel: + lttng_ht_destroy(luc->ctx); + lttng_ht_destroy(luc->events); free(luc); error: return NULL; @@ -243,8 +274,6 @@ struct ltt_ust_event *trace_ust_create_event(struct lttng_event *ev) /* Init node */ lttng_ht_node_init_str(&lue->node, lue->attr.name); - /* Alloc context hash tables */ - lue->ctx = lttng_ht_new(0, LTTNG_HT_TYPE_ULONG); DBG2("Trace UST event %s, loglevel (%d,%d) created", lue->attr.name, lue->attr.loglevel_type, @@ -276,7 +305,7 @@ struct ltt_ust_metadata *trace_ust_create_metadata(char *path) /* Set default attributes */ lum->attr.overwrite = DEFAULT_CHANNEL_OVERWRITE; - lum->attr.subbuf_size = DEFAULT_METADATA_SUBBUF_SIZE; + lum->attr.subbuf_size = default_get_metadata_subbuf_size(); lum->attr.num_subbuf = DEFAULT_METADATA_SUBBUF_NUM; lum->attr.switch_timer_interval = DEFAULT_CHANNEL_SWITCH_TIMER; lum->attr.read_timer_interval = DEFAULT_CHANNEL_READ_TIMER; @@ -380,8 +409,7 @@ static void destroy_contexts(struct lttng_ht *ht) void trace_ust_destroy_event(struct ltt_ust_event *event) { DBG2("Trace destroy UST event %s", event->attr.name); - destroy_contexts(event->ctx); - + free(event->filter); free(event); } @@ -453,8 +481,10 @@ static void destroy_channel_rcu(struct rcu_head *head) */ void trace_ust_destroy_metadata(struct ltt_ust_metadata *metadata) { + if (!metadata->handle) { + return; + } DBG2("Trace UST destroy metadata %d", metadata->handle); - free(metadata); } @@ -536,13 +566,16 @@ void trace_ust_destroy_session(struct ltt_ust_session *session) rcu_read_lock(); - DBG2("Trace UST destroy session %d", session->id); + DBG2("Trace UST destroy session %u", session->id); /* Cleaning up UST domain */ destroy_domain_global(&session->domain_global); destroy_domain_pid(session->domain_pid); destroy_domain_exec(session->domain_exec); + consumer_destroy_output(session->consumer); + consumer_destroy_output(session->tmp_consumer); + free(session); rcu_read_unlock();