X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Fcontext.c;fp=ltt-sessiond%2Fcontext.c;h=c7765c0e851056a329a97594164e8815ca5409ec;hp=35cb50b7b0c8cde13b8ee1c56bdec2341033e41e;hb=2bdd86d4c47902237c691d3c5409f32f205df81e;hpb=f2fc6720dff91c4076318acff69aa3bb5e70060a diff --git a/ltt-sessiond/context.c b/ltt-sessiond/context.c index 35cb50b7b..c7765c0e8 100644 --- a/ltt-sessiond/context.c +++ b/ltt-sessiond/context.c @@ -25,6 +25,14 @@ #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 "kernel-ctl.h" @@ -191,3 +199,174 @@ int context_kernel_add(struct ltt_kernel_session *ksession, error: return ret; } + +/* + * UST support. + */ + +/* + * Add UST context to an event of a specific channel. + */ +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_get_event_by_name(event_name, ustchan); + 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; +} + +/* + * 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) +{ + 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); + + /* Go over all channels */ + cds_list_for_each_entry(ustchan, &ustsession->channels.head, list) { + 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; + } + } + } + + if (!found && !no_event) { + ret = LTTCOMM_NO_EVENT; + goto error; + } + + ret = LTTCOMM_OK; + +error: + return ret; +} + +/* + * 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) +{ + 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; +} + +/* + * 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 ret; + struct ltt_ust_channel *ustchan; + struct lttng_ust_context ustctx; + + /* Setup UST context structure */ + ustctx.ctx = ctx->ctx; + + if (strlen(channel_name) == 0) { + ret = add_ustctx_all_channels(ustsession, &ustctx, event_name); + if (ret != LTTCOMM_OK) { + goto error; + } + } else { + /* Get UST channel */ + ustchan = trace_ust_get_channel_by_name(channel_name, ustsession); + 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; +}