Add a --with-consumerd-only configure option
[lttng-tools.git] / lttng-sessiond / ust-app.c
index 3f4c4c661fb4aa10d8bb6680c1687d9f6b23ad0b..0472251434dbb8fb1953ceda2777ce7a46412adb 100644 (file)
@@ -83,13 +83,15 @@ static void delete_ust_app_channel(int sock, struct ust_app_channel *ua_chan)
 
        /* TODO : remove channel context */
        //cds_lfht_for_each_entry(ltc->ctx, &iter, ltctx, node) {
-       //      hashtable_del(ltc->ctx, &iter);
+       //      ret = hashtable_del(ltc->ctx, &iter);
+       //      assert(!ret);
        //      delete_ust_app_ctx(sock, ltctx);
        //}
        //ret = hashtable_destroy(ltc->ctx);
 
        cds_lfht_for_each_entry(ua_chan->events, &iter, ua_event, node) {
-               hashtable_del(ua_chan->events, &iter);
+               ret = hashtable_del(ua_chan->events, &iter);
+               assert(!ret);
                delete_ust_app_event(sock, ua_event);
        }
 
@@ -128,7 +130,8 @@ static void delete_ust_app_session(int sock,
        }
 
        cds_lfht_for_each_entry(ua_sess->channels, &iter, ua_chan, node) {
-               hashtable_del(ua_sess->channels, &iter);
+               ret = hashtable_del(ua_sess->channels, &iter);
+               assert(!ret);
                delete_ust_app_channel(sock, ua_chan);
        }
 
@@ -181,7 +184,8 @@ static void delete_ust_app(struct ust_app *app)
        app->key.sock = -1;
 
        cds_lfht_for_each_entry(app->sessions, &iter, ua_sess, node) {
-               hashtable_del(app->sessions, &iter);
+               ret = hashtable_del(app->sessions, &iter);
+               assert(!ret);
                delete_ust_app_session(app->key.sock, ua_sess);
        }
 
@@ -288,8 +292,6 @@ static int disable_ust_channel(struct ust_app *app,
                goto error;
        }
 
-       ua_chan->enabled = 0;
-
        DBG2("UST app channel %s disabled successfully for app (pid: %d)",
                        ua_chan->name, app->key.pid);
 
@@ -422,6 +424,14 @@ static int create_ust_channel(struct ust_app *app,
        DBG2("UST app channel %s created successfully for pid:%d and sock:%d",
                        ua_chan->name, app->key.pid, app->key.sock);
 
+       /* If channel is not enabled, disable it on the tracer */
+       if (!ua_chan->enabled) {
+               ret = disable_ust_channel(app, ua_sess, ua_chan);
+               if (ret < 0) {
+                       goto error;
+               }
+       }
+
 error:
        return ret;
 }
@@ -445,11 +455,18 @@ int create_ust_event(struct ust_app *app, struct ust_app_session *ua_sess,
        }
 
        ua_event->handle = ua_event->obj->handle;
-       ua_event->enabled = 1;
 
        DBG2("UST app event %s created successfully for pid:%d",
                        ua_event->attr.name, app->key.pid);
 
+       /* If event not enabled, disable it on the tracer */
+       if (!ua_event->enabled) {
+               ret = disable_ust_event(app, ua_sess, ua_event);
+               if (ret < 0) {
+                       goto error;
+               }
+       }
+
 error:
        return ret;
 }
@@ -496,6 +513,7 @@ static struct ust_app_channel *alloc_ust_app_channel(char *name,
        strncpy(ua_chan->name, name, sizeof(ua_chan->name));
        ua_chan->name[sizeof(ua_chan->name) - 1] = '\0';
 
+       ua_chan->enabled = 1;
        ua_chan->handle = -1;
        ua_chan->ctx = hashtable_new(0);
        ua_chan->events = hashtable_new_str(0);
@@ -532,6 +550,7 @@ static struct ust_app_event *alloc_ust_app_event(char *name,
                goto error;
        }
 
+       ua_event->enabled = 1;
        strncpy(ua_event->name, name, sizeof(ua_event->name));
        ua_event->name[sizeof(ua_event->name) - 1] = '\0';
        ua_event->ctx = hashtable_new(0);
@@ -798,29 +817,19 @@ error:
 /*
  * Lookup ust app channel for session and disable it on the tracer side.
  */
-static int disable_ust_app_channel(struct ust_app_session *ua_sess,
-               struct ltt_ust_channel *uchan, struct ust_app *app)
+static
+int disable_ust_app_channel(struct ust_app_session *ua_sess,
+               struct ust_app_channel *ua_chan, struct ust_app *app)
 {
-       int ret = 0;
-       struct cds_lfht_iter iter;
-       struct cds_lfht_node *ua_chan_node;
-       struct ust_app_channel *ua_chan;
-
-       ua_chan_node = hashtable_lookup(ua_sess->channels,
-                       (void *)uchan->name, strlen(uchan->name), &iter);
-       if (ua_chan_node == NULL) {
-               DBG2("Unable to find channel %s in ust session uid %u",
-                               uchan->name, ua_sess->uid);
-               goto error;
-       }
-
-       ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node);
+       int ret;
 
        ret = disable_ust_channel(app, ua_sess, ua_chan);
        if (ret < 0) {
                goto error;
        }
 
+       ua_chan->enabled = 0;
+
 error:
        return ret;
 }
@@ -933,6 +942,8 @@ int create_ust_app_event(struct ust_app_session *ua_sess,
                goto error;
        }
 
+       ua_event->enabled = 1;
+
        hashtable_add_unique(ua_chan->events, &ua_event->node);
 
 end:
@@ -1098,6 +1109,7 @@ void ust_app_unregister(int sock)
        struct ust_app *lta;
        struct cds_lfht_node *node;
        struct cds_lfht_iter iter;
+       int ret;
 
        rcu_read_lock();
        lta = find_app_by_sock(sock);
@@ -1116,7 +1128,8 @@ void ust_app_unregister(int sock)
                goto error;
        }
 
-       hashtable_del(ust_app_ht, &iter);
+       ret = hashtable_del(ust_app_ht, &iter);
+       assert(!ret);
        call_rcu(&node->head, delete_ust_app_rcu);
 error:
        rcu_read_unlock();
@@ -1204,7 +1217,6 @@ error:
 void ust_app_clean_list(void)
 {
        int ret;
-       struct cds_lfht_node *node;
        struct cds_lfht_iter iter;
        struct ust_app *app;
 
@@ -1214,9 +1226,8 @@ void ust_app_clean_list(void)
 
        cds_lfht_for_each_entry(ust_app_ht, &iter, app, node) {
                ret = hashtable_del(ust_app_ht, &iter);
-               if (!ret) {
-                       call_rcu(&node->head, delete_ust_app_rcu);
-               }
+               assert(!ret);
+               call_rcu(&iter.node->head, delete_ust_app_rcu);
        }
 
        hashtable_destroy(ust_app_ht);
@@ -1242,8 +1253,10 @@ int ust_app_disable_channel_glb(struct ltt_ust_session *usess,
 {
        int ret = 0;
        struct cds_lfht_iter iter;
+       struct cds_lfht_node *ua_chan_node;
        struct ust_app *app;
        struct ust_app_session *ua_sess;
+       struct ust_app_channel *ua_chan;
 
        if (usess == NULL || uchan == NULL) {
                ERR("Disabling UST global channel with NULL values");
@@ -1251,7 +1264,7 @@ int ust_app_disable_channel_glb(struct ltt_ust_session *usess,
                goto error;
        }
 
-       DBG2("UST app disablling channel %s from global domain for session uid %d",
+       DBG2("UST app disabling channel %s from global domain for session uid %d",
                        uchan->name, usess->uid);
 
        rcu_read_lock();
@@ -1263,8 +1276,18 @@ int ust_app_disable_channel_glb(struct ltt_ust_session *usess,
                        continue;
                }
 
-               /* Create channel onto application */
-               ret = disable_ust_app_channel(ua_sess, uchan, app);
+               /* Get channel */
+               ua_chan_node = hashtable_lookup(ua_sess->channels,
+                               (void *)uchan->name, strlen(uchan->name), &iter);
+               /* If the session if found for the app, the channel must be there */
+               assert(ua_chan_node);
+
+               ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node);
+               /* The channel must not be already disabled */
+               assert(ua_chan->enabled == 1);
+
+               /* Disable channel onto application */
+               ret = disable_ust_app_channel(ua_sess, ua_chan, app);
                if (ret < 0) {
                        /* XXX: We might want to report this error at some point... */
                        continue;
@@ -1750,6 +1773,7 @@ int ust_app_destroy_trace(struct ltt_ust_session *usess, struct ust_app *app)
        struct lttng_ust_object_data obj;
        struct cds_lfht_iter iter;
        struct cds_lfht_node *node;
+       int ret;
 
        DBG("Destroy tracing for ust app pid %d", app->key.pid);
 
@@ -1762,7 +1786,8 @@ int ust_app_destroy_trace(struct ltt_ust_session *usess, struct ust_app *app)
                goto error_rcu_unlock;
        }
        ua_sess = caa_container_of(node, struct ust_app_session, node);
-       hashtable_del(app->sessions, &iter);
+       ret = hashtable_del(app->sessions, &iter);
+       assert(!ret);
        delete_ust_app_session(app->key.sock, ua_sess);
        obj.handle = ua_sess->handle;
        obj.shm_fd = -1;
This page took 0.026023 seconds and 4 git commands to generate.