X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Fcontext.c;h=41e33ec27634a56489be547ecff0b6e3381048d5;hp=35cb50b7b0c8cde13b8ee1c56bdec2341033e41e;hb=48842b309b2000205367409c0f29ca40ec3e251c;hpb=54d01ffb43587b221dc50ec42b6070fad89bd255 diff --git a/ltt-sessiond/context.c b/ltt-sessiond/context.c index 35cb50b7b..41e33ec27 100644 --- a/ltt-sessiond/context.c +++ b/ltt-sessiond/context.c @@ -25,7 +25,16 @@ #include #include +#ifdef CONFIG_LTTNG_TOOLS_HAVE_UST +#include +#include +#else +#include "lttng-ust-ctl.h" +#include "lttng-ust-abi.h" +#endif + #include "context.h" +#include "hashtable.h" #include "kernel-ctl.h" /* @@ -191,3 +200,197 @@ int context_kernel_add(struct ltt_kernel_session *ksession, 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; + } + } + + ret = LTTCOMM_OK; + +error: + return ret; +}