X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fcontext.c;h=1bf3c67680ed9d1f568c5d8b2b6455fa9d33edff;hp=0144f78248ee8c908077be0ec3b2f9aa66add057;hb=f73fabfda365d22e7dd180fb1614e37c446fbd9e;hpb=db7586006bc1a2b9057a2c108bf1e7d20fd6903f diff --git a/src/bin/lttng-sessiond/context.c b/src/bin/lttng-sessiond/context.c index 0144f7824..1bf3c6768 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 @@ -78,13 +78,13 @@ static int add_kctx_all_channels(struct ltt_kernel_session *ksession, if (no_event) { ret = kernel_add_channel_context(kchan, kctx); if (ret < 0) { - ret = LTTCOMM_KERN_CONTEXT_FAIL; + ret = LTTNG_ERR_KERN_CONTEXT_FAIL; goto error; } } else { ret = add_kctx_to_event(kctx, kchan, event_name); if (ret < 0) { - ret = LTTCOMM_KERN_CONTEXT_FAIL; + ret = LTTNG_ERR_KERN_CONTEXT_FAIL; goto error; } else if (ret == 1) { /* Event found and context added */ @@ -95,11 +95,11 @@ static int add_kctx_all_channels(struct ltt_kernel_session *ksession, } if (!found && !no_event) { - ret = LTTCOMM_NO_EVENT; + ret = LTTNG_ERR_NO_EVENT; goto error; } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -125,13 +125,13 @@ static int add_kctx_to_channel(struct lttng_kernel_context *kctx, if (no_event) { ret = kernel_add_channel_context(kchan, kctx); if (ret < 0) { - ret = LTTCOMM_KERN_CONTEXT_FAIL; + ret = LTTNG_ERR_KERN_CONTEXT_FAIL; goto error; } } else { ret = add_kctx_to_event(kctx, kchan, event_name); if (ret < 0) { - ret = LTTCOMM_KERN_CONTEXT_FAIL; + ret = LTTNG_ERR_KERN_CONTEXT_FAIL; goto error; } else if (ret == 1) { /* Event found and context added */ @@ -140,11 +140,11 @@ static int add_kctx_to_channel(struct lttng_kernel_context *kctx, } if (!found && !no_event) { - ret = LTTCOMM_NO_EVENT; + ret = LTTNG_ERR_NO_EVENT; goto error; } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -158,11 +158,13 @@ static int add_uctx_to_channel(struct ltt_ust_session *usess, int domain, { 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) { - ret = LTTCOMM_FATAL; + ret = -EINVAL; goto error; } @@ -174,14 +176,24 @@ static int add_uctx_to_channel(struct ltt_ust_session *usess, int domain, } break; default: - ret = LTTCOMM_NOT_IMPLEMENTED; + ret = -ENOSYS; + goto error; + } + + /* Lookup context before adding it */ + lttng_ht_lookup(uchan->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 channel */ lttng_ht_add_unique_ulong(uchan->ctx, &uctx->node); - return LTTCOMM_OK; + DBG("Context UST %d added to channel %s", uctx->ctx.ctx, uchan->name); + + return 0; error: free(uctx); @@ -197,11 +209,14 @@ static int add_uctx_to_event(struct ltt_ust_session *usess, int domain, { 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) { - ret = LTTCOMM_FATAL; + /* Context values are invalid. */ + ret = -EINVAL; goto error; } @@ -213,14 +228,24 @@ static int add_uctx_to_event(struct ltt_ust_session *usess, int domain, } break; default: - ret = LTTCOMM_NOT_IMPLEMENTED; + 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); - return LTTCOMM_OK; + DBG("Context UST %d added to event %s", uctx->ctx.ctx, uevent->attr.name); + + return 0; error: free(uctx); @@ -239,7 +264,44 @@ int context_kernel_add(struct ltt_kernel_session *ksession, struct lttng_kernel_context kctx; /* Setup kernel context structure */ - kctx.ctx = ctx->ctx; + switch (ctx->ctx) { + case LTTNG_EVENT_CONTEXT_PID: + kctx.ctx = LTTNG_KERNEL_CONTEXT_PID; + break; + case LTTNG_EVENT_CONTEXT_PERF_COUNTER: + kctx.ctx = LTTNG_KERNEL_CONTEXT_PERF_COUNTER; + break; + case LTTNG_EVENT_CONTEXT_PROCNAME: + kctx.ctx = LTTNG_KERNEL_CONTEXT_PROCNAME; + break; + case LTTNG_EVENT_CONTEXT_PRIO: + kctx.ctx = LTTNG_KERNEL_CONTEXT_PRIO; + break; + case LTTNG_EVENT_CONTEXT_NICE: + kctx.ctx = LTTNG_KERNEL_CONTEXT_NICE; + break; + case LTTNG_EVENT_CONTEXT_VPID: + kctx.ctx = LTTNG_KERNEL_CONTEXT_VPID; + break; + case LTTNG_EVENT_CONTEXT_TID: + kctx.ctx = LTTNG_KERNEL_CONTEXT_TID; + break; + case LTTNG_EVENT_CONTEXT_VTID: + kctx.ctx = LTTNG_KERNEL_CONTEXT_VTID; + break; + case LTTNG_EVENT_CONTEXT_PPID: + kctx.ctx = LTTNG_KERNEL_CONTEXT_PPID; + break; + 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 LTTNG_ERR_KERN_CONTEXT_FAIL; + } + 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, @@ -248,24 +310,24 @@ int context_kernel_add(struct ltt_kernel_session *ksession, if (strlen(channel_name) == 0) { ret = add_kctx_all_channels(ksession, &kctx, event_name); - if (ret != LTTCOMM_OK) { + 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) { + if (ret != LTTNG_OK) { goto error; } } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -278,8 +340,8 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, struct lttng_event_context *ctx, char *event_name, char *channel_name) { - int ret = LTTCOMM_OK, have_event = 0; - struct lttng_ht_iter iter, uiter; + int ret = LTTNG_OK, have_event = 0; + struct lttng_ht_iter iter; struct lttng_ht *chan_ht; struct ltt_ust_channel *uchan = NULL; struct ltt_ust_event *uevent = NULL; @@ -292,11 +354,13 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, case LTTNG_DOMAIN_UST: chan_ht = usess->domain_global.channels; break; +#if 0 case LTTNG_DOMAIN_UST_EXEC_NAME: case LTTNG_DOMAIN_UST_PID: case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN: +#endif default: - ret = LTTCOMM_NOT_IMPLEMENTED; + ret = LTTNG_ERR_UND; goto error; } @@ -309,7 +373,7 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, 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; } } @@ -318,7 +382,7 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, if (uchan && have_event) { uevent = trace_ust_find_event_by_name(uchan->events, event_name); if (uevent == NULL) { - ret = LTTCOMM_UST_EVENT_NOT_FOUND; + ret = LTTNG_ERR_UST_EVENT_NOT_FOUND; goto error; } } @@ -343,42 +407,38 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, goto end; } } - ret = LTTCOMM_UST_EVENT_NOT_FOUND; + ret = LTTNG_ERR_UST_EVENT_NOT_FOUND; goto error; } else if (!uchan && !have_event) { /* Add ctx all events, all channels */ /* For all channels */ cds_lfht_for_each_entry(chan_ht->ht, &iter.iter, uchan, node.node) { ret = add_uctx_to_channel(usess, domain, uchan, ctx); if (ret < 0) { - ERR("Context added to channel %s failed", uchan->name); + ERR("Context failed for channel %s", uchan->name); continue; } - - /* For all events in channel */ - cds_lfht_for_each_entry(uchan->events->ht, &uiter.iter, uevent, - node.node) { - ret = add_uctx_to_event(usess, domain, uchan, uevent, ctx); - if (ret < 0) { - ERR("Context add to event %s in channel %s failed", - uevent->attr.name, uchan->name); - continue; - } - } } } end: switch (ret) { case -EEXIST: - ret = LTTCOMM_UST_CONTEXT_EXIST; - goto error; + ret = LTTNG_ERR_UST_CONTEXT_EXIST; + break; case -ENOMEM: - ret = LTTCOMM_FATAL; - goto error; + ret = LTTNG_ERR_FATAL; + break; + case -EINVAL: + ret = LTTNG_ERR_UST_CONTEXT_INVAL; + break; + case -ENOSYS: + ret = LTTNG_ERR_UNKNOWN_DOMAIN; + break; + default: + ret = LTTNG_OK; + break; } - return LTTCOMM_OK; - error: return ret; }