Fix UST context on global update
authorDavid Goulet <dgoulet@efficios.com>
Mon, 30 Jan 2012 16:38:03 +0000 (11:38 -0500)
committerDavid Goulet <dgoulet@efficios.com>
Mon, 30 Jan 2012 16:38:03 +0000 (11:38 -0500)
Contexts were not added to the application upon registration.

Improve error handling on add context for event and channel.

Fix add_ust_ctx_* to lookup the context before adding it to the hash
table.

Signed-off-by: David Goulet <dgoulet@efficios.com>
src/bin/lttng-sessiond/context.c
src/bin/lttng-sessiond/ust-app.c

index 19eaa714521764de1bda512bde33f6123ddfe6d0..7eaeb6665b177aa1771942fa444d3e1174a74436 100644 (file)
@@ -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_UND;
+               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_UND;
+               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);
@@ -396,14 +421,21 @@ end:
        switch (ret) {
        case -EEXIST:
                ret = LTTCOMM_UST_CONTEXT_EXIST;
-               goto error;
+               break;
        case -ENOMEM:
                ret = LTTCOMM_FATAL;
-               goto error;
+               break;
+       case -EINVAL:
+               ret = LTTCOMM_UST_CONTEXT_FAIL;
+               break;
+       case -ENOSYS:
+               ret = LTTCOMM_UNKNOWN_DOMAIN;
+               break;
+       default:
+               ret = LTTCOMM_OK;
+               break;
        }
 
-       return LTTCOMM_OK;
-
 error:
        return ret;
 }
index a822071400c84938a3b7c19b68f3f8cb09f626a7..46799dc63982e0a4729c7030abdb408074baf547 100644 (file)
@@ -393,7 +393,7 @@ int create_ust_channel_context(struct ust_app_channel *ua_chan,
 
        ua_ctx->handle = ua_ctx->obj->handle;
 
-       DBG2("UST app context added to channel %s successfully", ua_chan->name);
+       DBG2("UST app context created successfully for channel %s", ua_chan->name);
 
 error:
        return ret;
@@ -416,7 +416,7 @@ int create_ust_event_context(struct ust_app_event *ua_event,
 
        ua_ctx->handle = ua_ctx->obj->handle;
 
-       DBG2("UST app context added to event %s successfully", ua_event->name);
+       DBG2("UST app context created successfully for event %s", ua_event->name);
 
 error:
        return ret;
@@ -2202,12 +2202,13 @@ int ust_app_destroy_trace_all(struct ltt_ust_session *usess)
  */
 void ust_app_global_update(struct ltt_ust_session *usess, int sock)
 {
-       int ret = 0;
-       struct lttng_ht_iter iter, uiter;
+       int ret = 0, ctx_on_chan = 0;
+       struct lttng_ht_iter iter, uiter, iter_ctx;
        struct ust_app *app;
        struct ust_app_session *ua_sess;
        struct ust_app_channel *ua_chan;
        struct ust_app_event *ua_event;
+       struct ust_app_ctx *ua_ctx;
 
        if (usess == NULL) {
                ERR("No UST session on global update. Returning");
@@ -2247,6 +2248,16 @@ void ust_app_global_update(struct ltt_ust_session *usess, int sock)
                        continue;
                }
 
+               cds_lfht_for_each_entry(ua_chan->ctx->ht, &iter_ctx.iter, ua_ctx,
+                               node.node) {
+                       ret = create_ust_channel_context(ua_chan, ua_ctx, app);
+                       if (ret < 0) {
+                               /* FIXME: Should we quit here or continue... */
+                               continue;
+                       }
+               }
+
+
                /* For each events */
                cds_lfht_for_each_entry(ua_chan->events->ht, &uiter.iter, ua_event,
                                node.node) {
@@ -2255,7 +2266,20 @@ void ust_app_global_update(struct ltt_ust_session *usess, int sock)
                                /* FIXME: Should we quit here or continue... */
                                continue;
                        }
+
+                       /* Add context on events. */
+                       cds_lfht_for_each_entry(ua_event->ctx->ht, &iter_ctx.iter,
+                                       ua_ctx, node.node) {
+                               ret = create_ust_event_context(ua_event, ua_ctx, app);
+                               if (ret < 0) {
+                                       /* FIXME: Should we quit here or continue... */
+                                       continue;
+                               }
+                       }
                }
+
+               /* Reset flag */
+               ctx_on_chan = 0;
        }
 
        if (usess->start_trace) {
This page took 0.03228 seconds and 5 git commands to generate.