X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fcontext.c;h=74afd4e0cad5ff87d307de751672ad1ae86bad61;hp=9727258bf130b0f8912a9edb67f0c6a77f3aa4f8;hb=c4a1715b6c7b500eac97e149b3994a877f3023bb;hpb=ae8564917fa3cb3497ec17951d8ac0ee28de9c81 diff --git a/src/bin/lttng-sessiond/context.c b/src/bin/lttng-sessiond/context.c index 9727258bf..74afd4e0c 100644 --- a/src/bin/lttng-sessiond/context.c +++ b/src/bin/lttng-sessiond/context.c @@ -1,18 +1,18 @@ /* * Copyright (C) 2011 - David Goulet * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; only version 2 of the License. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 2 only, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place - Suite 330, Boston, MA 02111-1307, USA. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define _GNU_SOURCE @@ -30,76 +30,27 @@ #include "ust-app.h" #include "trace-ust.h" -/* - * Add kernel context to an event of a specific channel. - */ -static int add_kctx_to_event(struct lttng_kernel_context *kctx, - struct ltt_kernel_channel *kchan, char *event_name) -{ - int ret, found = 0; - struct ltt_kernel_event *kevent; - - DBG("Add kernel context to event %s", event_name); - - kevent = trace_kernel_get_event_by_name(event_name, kchan); - if (kevent != NULL) { - ret = kernel_add_event_context(kevent, kctx); - if (ret < 0) { - goto error; - } - found = 1; - } - - ret = found; - -error: - return ret; -} - /* * Add kernel context to all channel. - * - * If event_name is specified, add context to event instead. */ static int add_kctx_all_channels(struct ltt_kernel_session *ksession, - struct lttng_kernel_context *kctx, char *event_name) + struct lttng_kernel_context *kctx) { - int ret, no_event = 0, found = 0; + int ret; struct ltt_kernel_channel *kchan; - if (strlen(event_name) == 0) { - no_event = 1; - } - - DBG("Adding kernel context to all channels (event: %s)", event_name); + DBG("Adding kernel context to all channels"); /* Go over all channels */ cds_list_for_each_entry(kchan, &ksession->channel_list.head, list) { - if (no_event) { - ret = kernel_add_channel_context(kchan, kctx); - if (ret < 0) { - ret = LTTCOMM_KERN_CONTEXT_FAIL; - goto error; - } - } else { - ret = add_kctx_to_event(kctx, kchan, event_name); - if (ret < 0) { - ret = LTTCOMM_KERN_CONTEXT_FAIL; - goto error; - } else if (ret == 1) { - /* Event found and context added */ - found = 1; - break; - } + ret = kernel_add_channel_context(kchan, kctx); + if (ret < 0) { + ret = LTTNG_ERR_KERN_CONTEXT_FAIL; + goto error; } } - if (!found && !no_event) { - ret = LTTCOMM_NO_EVENT; - goto error; - } - - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -107,44 +58,21 @@ error: /* * Add kernel context to a specific channel. - * - * If event_name is specified, add context to that event. */ static int add_kctx_to_channel(struct lttng_kernel_context *kctx, - struct ltt_kernel_channel *kchan, char *event_name) + struct ltt_kernel_channel *kchan) { - int ret, no_event = 0, found = 0; - - if (strlen(event_name) == 0) { - no_event = 1; - } + int ret; - DBG("Add kernel context to channel '%s', event '%s'", - kchan->channel->name, event_name); + DBG("Add kernel context to channel '%s'", kchan->channel->name); - if (no_event) { - ret = kernel_add_channel_context(kchan, kctx); - if (ret < 0) { - ret = LTTCOMM_KERN_CONTEXT_FAIL; - goto error; - } - } else { - ret = add_kctx_to_event(kctx, kchan, event_name); - if (ret < 0) { - ret = LTTCOMM_KERN_CONTEXT_FAIL; - goto error; - } else if (ret == 1) { - /* Event found and context added */ - found = 1; - } - } - - if (!found && !no_event) { - ret = LTTCOMM_NO_EVENT; + ret = kernel_add_channel_context(kchan, kctx); + if (ret < 0) { + ret = LTTNG_ERR_KERN_CONTEXT_FAIL; goto error; } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -200,64 +128,11 @@ error: return ret; } -/* - * Add UST context to event. - */ -static int add_uctx_to_event(struct ltt_ust_session *usess, int domain, - struct ltt_ust_channel *uchan, struct ltt_ust_event *uevent, - struct lttng_event_context *ctx) -{ - int ret; - struct ltt_ust_context *uctx; - struct lttng_ht_iter iter; - struct lttng_ht_node_ulong *uctx_node; - - /* Create ltt UST context */ - uctx = trace_ust_create_context(ctx); - if (uctx == NULL) { - /* Context values are invalid. */ - ret = -EINVAL; - goto error; - } - - switch (domain) { - case LTTNG_DOMAIN_UST: - ret = ust_app_add_ctx_event_glb(usess, uchan, uevent, uctx); - if (ret < 0) { - goto error; - } - break; - default: - ret = -ENOSYS; - goto error; - } - - /* Lookup context before adding it */ - lttng_ht_lookup(uevent->ctx, (void *)((unsigned long)uctx->ctx.ctx), &iter); - uctx_node = lttng_ht_iter_get_node_ulong(&iter); - if (uctx_node != NULL) { - ret = -EEXIST; - goto error; - } - - /* Add ltt UST context node to ltt UST event */ - lttng_ht_add_unique_ulong(uevent->ctx, &uctx->node); - - DBG("Context UST %d added to event %s", uctx->ctx.ctx, uevent->attr.name); - - return 0; - -error: - free(uctx); - return ret; -} - /* * Add kernel context to tracer. */ int context_kernel_add(struct ltt_kernel_session *ksession, - struct lttng_event_context *ctx, char *event_name, - char *channel_name) + struct lttng_event_context *ctx, char *channel_name) { int ret; struct ltt_kernel_channel *kchan; @@ -295,8 +170,11 @@ int context_kernel_add(struct ltt_kernel_session *ksession, case LTTNG_EVENT_CONTEXT_VPPID: kctx.ctx = LTTNG_KERNEL_CONTEXT_VPPID; break; + case LTTNG_EVENT_CONTEXT_HOSTNAME: + kctx.ctx = LTTNG_KERNEL_CONTEXT_HOSTNAME; + break; default: - return LTTCOMM_KERN_CONTEXT_FAIL; + return LTTNG_ERR_KERN_CONTEXT_FAIL; } kctx.u.perf_counter.type = ctx->u.perf_counter.type; @@ -306,25 +184,25 @@ int context_kernel_add(struct ltt_kernel_session *ksession, 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); - if (ret != LTTCOMM_OK) { + ret = add_kctx_all_channels(ksession, &kctx); + if (ret != LTTNG_OK) { goto error; } } else { /* Get kernel channel */ kchan = trace_kernel_get_channel_by_name(channel_name, ksession); if (kchan == NULL) { - ret = LTTCOMM_KERN_CHAN_NOT_FOUND; + ret = LTTNG_ERR_KERN_CHAN_NOT_FOUND; goto error; } - ret = add_kctx_to_channel(&kctx, kchan, event_name); - if (ret != LTTCOMM_OK) { + ret = add_kctx_to_channel(&kctx, kchan); + if (ret != LTTNG_OK) { goto error; } } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -334,14 +212,12 @@ error: * Add UST context to tracer. */ int context_ust_add(struct ltt_ust_session *usess, int domain, - struct lttng_event_context *ctx, char *event_name, - char *channel_name) + struct lttng_event_context *ctx, char *channel_name) { - int ret = LTTCOMM_OK, have_event = 0, no_chan = 1; + int ret = LTTNG_OK; struct lttng_ht_iter iter; struct lttng_ht *chan_ht; struct ltt_ust_channel *uchan = NULL; - struct ltt_ust_event *uevent = NULL; /* * Define which channel's hashtable to use from the domain or quit if @@ -357,59 +233,25 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN: #endif default: - ret = LTTCOMM_UND; + ret = LTTNG_ERR_UND; goto error; } - /* Do we have an event name */ - if (strlen(event_name) != 0) { - have_event = 1; - } - /* Get UST channel if defined */ if (strlen(channel_name) != 0) { uchan = trace_ust_find_channel_by_name(chan_ht, channel_name); if (uchan == NULL) { - ret = LTTCOMM_UST_CHAN_NOT_FOUND; + ret = LTTNG_ERR_UST_CHAN_NOT_FOUND; goto error; } } - /* If UST channel specified and event name, get UST event ref */ - if (uchan && have_event) { - uevent = trace_ust_find_event_by_name(uchan->events, event_name); - if (uevent == NULL) { - ret = LTTCOMM_UST_EVENT_NOT_FOUND; - goto error; - } - } - - /* At this point, we have 4 possibilities */ - - if (uchan && uevent) { /* Add ctx to event in channel */ - ret = add_uctx_to_event(usess, domain, uchan, uevent, ctx); - } else if (uchan && !have_event) { /* Add ctx to channel */ + if (uchan) { + /* Add ctx to channel */ ret = add_uctx_to_channel(usess, domain, uchan, ctx); - } else if (!uchan && have_event) { /* Add ctx to event */ - /* Add context to event without having the channel name */ - cds_lfht_for_each_entry(chan_ht->ht, &iter.iter, uchan, node.node) { - uevent = trace_ust_find_event_by_name(uchan->events, event_name); - if (uevent != NULL) { - ret = add_uctx_to_event(usess, domain, uchan, uevent, ctx); - /* - * LTTng UST does not allowed the same event to be registered - * multiple time in different or the same channel. So, if we - * found our event, we stop. - */ - goto end; - } - } - ret = LTTCOMM_UST_EVENT_NOT_FOUND; - goto error; - } else if (!uchan && !have_event) { /* Add ctx all events, all channels */ - /* For all channels */ + } else { + /* Add ctx all events, all channels */ cds_lfht_for_each_entry(chan_ht->ht, &iter.iter, uchan, node.node) { - no_chan = 0; ret = add_uctx_to_channel(usess, domain, uchan, ctx); if (ret < 0) { ERR("Context failed for channel %s", uchan->name); @@ -418,29 +260,24 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, } } -end: switch (ret) { case -EEXIST: - ret = LTTCOMM_UST_CONTEXT_EXIST; + ret = LTTNG_ERR_UST_CONTEXT_EXIST; break; case -ENOMEM: - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; break; case -EINVAL: - ret = LTTCOMM_UST_CONTEXT_INVAL; + ret = LTTNG_ERR_UST_CONTEXT_INVAL; break; case -ENOSYS: - ret = LTTCOMM_UNKNOWN_DOMAIN; + ret = LTTNG_ERR_UNKNOWN_DOMAIN; break; default: - ret = LTTCOMM_OK; + ret = LTTNG_OK; break; } - if (no_chan) { - ret = LTTCOMM_UST_CHAN_NOT_FOUND; - } - error: return ret; }