X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Fcontext.c;h=41e33ec27634a56489be547ecff0b6e3381048d5;hp=7ec75ffafd8c560a455562d276b5fc5374f04264;hb=48842b309b2000205367409c0f29ca40ec3e251c;hpb=1e307fab325060d9db4e989c0fdc3cddf46f50f6 diff --git a/ltt-sessiond/context.c b/ltt-sessiond/context.c index 7ec75ffaf..41e33ec27 100644 --- a/ltt-sessiond/context.c +++ b/ltt-sessiond/context.c @@ -20,12 +20,21 @@ #include #include #include +#include #include -#include +#include + +#ifdef CONFIG_LTTNG_TOOLS_HAVE_UST +#include +#include +#else +#include "lttng-ust-ctl.h" +#include "lttng-ust-abi.h" +#endif -#include "lttngerr.h" #include "context.h" +#include "hashtable.h" #include "kernel-ctl.h" /* @@ -39,7 +48,7 @@ static int add_kctx_to_event(struct lttng_kernel_context *kctx, DBG("Add kernel context to event %s", event_name); - kevent = get_kernel_event_by_name(event_name, kchan); + kevent = trace_kernel_get_event_by_name(event_name, kchan); if (kevent != NULL) { ret = kernel_add_event_context(kevent, kctx); if (ret < 0) { @@ -151,27 +160,230 @@ error: /* * Add kernel context to tracer. */ -int add_kernel_context(struct ltt_kernel_session *ksession, - struct lttng_kernel_context *kctx, char *event_name, +int context_kernel_add(struct ltt_kernel_session *ksession, + struct lttng_event_context *ctx, char *event_name, char *channel_name) { int ret; struct ltt_kernel_channel *kchan; + struct lttng_kernel_context kctx; + + /* Setup kernel context structure */ + kctx.ctx = ctx->ctx; + kctx.u.perf_counter.type = ctx->u.perf_counter.type; + kctx.u.perf_counter.config = ctx->u.perf_counter.config; + strncpy(kctx.u.perf_counter.name, ctx->u.perf_counter.name, + LTTNG_SYMBOL_NAME_LEN); + kctx.u.perf_counter.name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0'; if (strlen(channel_name) == 0) { - ret = add_kctx_all_channels(ksession, kctx, event_name); + ret = add_kctx_all_channels(ksession, &kctx, event_name); if (ret != LTTCOMM_OK) { goto error; } } else { /* Get kernel channel */ - kchan = get_kernel_channel_by_name(channel_name, ksession); + kchan = trace_kernel_get_channel_by_name(channel_name, ksession); if (kchan == NULL) { ret = LTTCOMM_KERN_CHAN_NOT_FOUND; goto error; } - ret = add_kctx_to_channel(kctx, kchan, event_name); + ret = add_kctx_to_channel(&kctx, kchan, event_name); + if (ret != LTTCOMM_OK) { + goto error; + } + } + + ret = LTTCOMM_OK; + +error: + return ret; +} + +/* + * UST support. + */ + +/* + * Add UST context to an event of a specific channel. + */ +#ifdef DISABLE +static int add_ustctx_to_event(struct ltt_ust_session *ustsession, + struct lttng_ust_context *ustctx, + struct ltt_ust_channel *ustchan, char *event_name) +{ + int ret, found = 0; + struct ltt_ust_event *ustevent; + struct object_data *context_data; /* FIXME: currently a memleak */ + + DBG("Add UST context to event %s", event_name); + + ustevent = trace_ust_find_event_by_name(ustchan->events, event_name); + if (ustevent != NULL) { + ret = ustctl_add_context(ustsession->sock, ustctx, + ustevent->obj, &context_data); + if (ret < 0) { + goto error; + } + found = 1; + } + + ret = found; + +error: + return ret; +} +#endif + +/* + * Add UST context to all channel. + * + * If event_name is specified, add context to event instead. + */ +static int add_ustctx_all_channels(struct ltt_ust_session *ustsession, + struct lttng_ust_context *ustctx, char *event_name, + struct cds_lfht *channels) +{ +#ifdef DISABLE + int ret, no_event = 0, found = 0; + struct ltt_ust_channel *ustchan; + struct object_data *context_data; /* FIXME: currently a memleak */ + + if (strlen(event_name) == 0) { + no_event = 1; + } + + DBG("Adding ust context to all channels (event: %s)", event_name); + + struct cds_lfht_node *node; + struct cds_lfht_iter iter; + + rcu_read_lock(); + hashtable_get_first(channels, &iter); + while ((node = hashtable_iter_get_node(&iter)) != NULL) { + ustchan = caa_container_of(node, struct ltt_ust_channel, node); + if (no_event) { + //ret = ustctl_add_context(ustsession->sock, + // ustctx, ustchan->obj, &context_data); + if (ret < 0) { + ret = LTTCOMM_UST_CONTEXT_FAIL; + goto error; + } + } else { + ret = add_ustctx_to_event(ustsession, ustctx, ustchan, event_name); + if (ret < 0) { + ret = LTTCOMM_UST_CONTEXT_FAIL; + goto error; + } else if (ret == 1) { + /* Event found and context added */ + found = 1; + break; + } + } + hashtable_get_next(channels, &iter); + } + rcu_read_unlock(); + + if (!found && !no_event) { + ret = LTTCOMM_NO_EVENT; + goto error; + } + + ret = LTTCOMM_OK; + +error: + return ret; +#endif + return 0; +} + +/* + * Add UST context to a specific channel. + * + * If event_name is specified, add context to that event. + */ +static int add_ustctx_to_channel(struct ltt_ust_session *ustsession, + struct lttng_ust_context *ustctx, + struct ltt_ust_channel *ustchan, char *event_name) +{ +#ifdef DISABLE + int ret, no_event = 0, found = 0; + struct object_data *context_data; /* FIXME: currently a memleak */ + + if (strlen(event_name) == 0) { + no_event = 1; + } + + DBG("Add UST context to channel '%s', event '%s'", + ustchan->name, event_name); + + if (no_event) { + //ret = ustctl_add_context(ustsession->sock, ustctx, + // ustchan->obj, &context_data); + if (ret < 0) { + ret = LTTCOMM_UST_CONTEXT_FAIL; + goto error; + } + } else { + ret = add_ustctx_to_event(ustsession, ustctx, ustchan, event_name); + if (ret < 0) { + ret = LTTCOMM_UST_CONTEXT_FAIL; + goto error; + } else if (ret == 1) { + /* Event found and context added */ + found = 1; + } + } + + if (!found && !no_event) { + ret = LTTCOMM_NO_EVENT; + goto error; + } + + ret = LTTCOMM_OK; + +error: + return ret; +#endif + return 0; +} + +/* + * Add UST context to tracer. + */ +int context_ust_add(struct ltt_ust_session *ustsession, + struct lttng_event_context *ctx, char *event_name, + char *channel_name, int domain) +{ + int ret; + struct cds_lfht *chan_ht = NULL; + struct ltt_ust_channel *ustchan; + struct lttng_ust_context ustctx; + + /* Setup UST context structure */ + ustctx.ctx = ctx->ctx; + + switch (domain) { + case LTTNG_DOMAIN_UST: + chan_ht = ustsession->domain_global.channels; + break; + } + + if (strlen(channel_name) == 0) { + ret = add_ustctx_all_channels(ustsession, &ustctx, event_name, chan_ht); + if (ret != LTTCOMM_OK) { + goto error; + } + } else { + /* Get UST channel */ + ustchan = trace_ust_find_channel_by_name(chan_ht, channel_name); + if (ustchan == NULL) { + ret = LTTCOMM_UST_CHAN_NOT_FOUND; + goto error; + } + + ret = add_ustctx_to_channel(ustsession, &ustctx, ustchan, event_name); if (ret != LTTCOMM_OK) { goto error; }