Fix: sessiond: don't allocate buffers and files for inactive sessions
[lttng-tools.git] / src / bin / lttng-sessiond / ust-app.c
index 8c5f3f6afc0e3dfdb7ad225f2963bce7bd526624..0b0a62532125e6bc7ecd4a72728f1b8e997a18ba 100644 (file)
@@ -4012,6 +4012,10 @@ int ust_app_disable_channel_glb(struct ltt_ust_session *usess,
        DBG2("UST app disabling channel %s from global domain for session id %" PRIu64,
                        uchan->name, usess->id);
 
+       if (!usess->active) {
+               goto end;
+       }
+
        rcu_read_lock();
 
        /* For every registered applications */
@@ -4050,6 +4054,7 @@ int ust_app_disable_channel_glb(struct ltt_ust_session *usess,
        rcu_read_unlock();
 
 error:
+end:
        return ret;
 }
 
@@ -4073,6 +4078,10 @@ int ust_app_enable_channel_glb(struct ltt_ust_session *usess,
        DBG2("UST app enabling channel %s to global domain for session id %" PRIu64,
                        uchan->name, usess->id);
 
+       if (!usess->active) {
+               goto end;
+       }
+
        rcu_read_lock();
 
        /* For every registered applications */
@@ -4100,6 +4109,7 @@ int ust_app_enable_channel_glb(struct ltt_ust_session *usess,
        rcu_read_unlock();
 
 error:
+end:
        return ret;
 }
 
@@ -4121,6 +4131,10 @@ int ust_app_disable_event_glb(struct ltt_ust_session *usess,
                        "%s for session id %" PRIu64,
                        uevent->attr.name, uchan->name, usess->id);
 
+       if (!usess->active) {
+               goto end;
+       }
+
        rcu_read_lock();
 
        /* For all registered applications */
@@ -4165,7 +4179,7 @@ int ust_app_disable_event_glb(struct ltt_ust_session *usess,
        }
 
        rcu_read_unlock();
-
+end:
        return ret;
 }
 
@@ -4187,6 +4201,10 @@ int ust_app_create_channel_glb(struct ltt_ust_session *usess,
        DBG2("UST app adding channel %s to UST domain for session id %" PRIu64,
                        uchan->name, usess->id);
 
+       if (!usess->active) {
+               goto end;
+       }
+
        rcu_read_lock();
 
        /* For every registered applications */
@@ -4266,6 +4284,7 @@ int ust_app_create_channel_glb(struct ltt_ust_session *usess,
 
 error_rcu_unlock:
        rcu_read_unlock();
+end:
        return ret;
 }
 
@@ -4286,6 +4305,10 @@ int ust_app_enable_event_glb(struct ltt_ust_session *usess,
        DBG("UST app enabling event %s for all apps for session id %" PRIu64,
                        uevent->attr.name, usess->id);
 
+       if (!usess->active) {
+               goto end;
+       }
+
        /*
         * NOTE: At this point, this function is called only if the session and
         * channel passed are already created for all apps. and enabled on the
@@ -4351,6 +4374,7 @@ int ust_app_enable_event_glb(struct ltt_ust_session *usess,
 
 error:
        rcu_read_unlock();
+end:
        return ret;
 }
 
@@ -4371,6 +4395,10 @@ int ust_app_create_event_glb(struct ltt_ust_session *usess,
        DBG("UST app creating event %s for all apps for session id %" PRIu64,
                        uevent->attr.name, usess->id);
 
+       if (!usess->active) {
+               goto end;
+       }
+
        rcu_read_lock();
 
        /* For all registered applications */
@@ -4417,7 +4445,7 @@ int ust_app_create_event_glb(struct ltt_ust_session *usess,
        }
 
        rcu_read_unlock();
-
+end:
        return ret;
 }
 
@@ -4996,6 +5024,12 @@ int ust_app_start_trace_all(struct ltt_ust_session *usess)
 
        DBG("Starting all UST traces");
 
+       /*
+        * Even though the start trace might fail, flag this session active so
+        * other application coming in are started by default.
+        */
+       usess->active = 1;
+
        rcu_read_lock();
 
        /*
@@ -5006,6 +5040,10 @@ int ust_app_start_trace_all(struct ltt_ust_session *usess)
         */
        (void) ust_app_clear_quiescent_session(usess);
 
+       cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
+               ust_app_global_update(usess, app);
+       }
+
        cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
                ret = ust_app_start_trace(usess, app);
                if (ret < 0) {
@@ -5031,6 +5069,12 @@ int ust_app_stop_trace_all(struct ltt_ust_session *usess)
 
        DBG("Stopping all UST traces");
 
+       /*
+        * Even though the stop trace might fail, flag this session inactive so
+        * other application coming in are not started by default.
+        */
+       usess->active = 0;
+
        rcu_read_lock();
 
        cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
@@ -5094,6 +5138,9 @@ void ust_app_global_create(struct ltt_ust_session *usess, struct ust_app *app)
                /* App session already created. */
                goto end;
        }
+       if (!usess->active) {
+               goto end;
+       }
        assert(ua_sess);
 
        pthread_mutex_lock(&ua_sess->lock);
@@ -5147,14 +5194,12 @@ void ust_app_global_create(struct ltt_ust_session *usess, struct ust_app *app)
 
        pthread_mutex_unlock(&ua_sess->lock);
 
-       if (usess->active) {
-               ret = ust_app_start_trace(usess, app);
-               if (ret < 0) {
-                       goto error;
-               }
-
-               DBG2("UST trace started for app pid %d", app->pid);
+       ret = ust_app_start_trace(usess, app);
+       if (ret < 0) {
+               goto error;
        }
+
+       DBG2("UST trace started for app pid %d", app->pid);
 end:
        /* Everything went well at this point. */
        return;
@@ -5196,7 +5241,9 @@ void ust_app_global_update(struct ltt_ust_session *usess, struct ust_app *app)
        if (!app->compatible) {
                return;
        }
-
+       if (!usess->active) {
+               return;
+       }
        if (trace_ust_pid_tracker_lookup(usess, app->pid)) {
                ust_app_global_create(usess, app);
        } else {
@@ -5212,6 +5259,9 @@ void ust_app_global_update_all(struct ltt_ust_session *usess)
        struct lttng_ht_iter iter;
        struct ust_app *app;
 
+       if (!usess->active) {
+               return;
+       }
        rcu_read_lock();
        cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
                ust_app_global_update(usess, app);
@@ -5232,6 +5282,10 @@ int ust_app_add_ctx_channel_glb(struct ltt_ust_session *usess,
        struct ust_app_session *ua_sess;
        struct ust_app *app;
 
+       if (!usess->active) {
+               goto end;
+       }
+
        rcu_read_lock();
 
        cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
@@ -5271,6 +5325,7 @@ int ust_app_add_ctx_channel_glb(struct ltt_ust_session *usess,
        }
 
        rcu_read_unlock();
+end:
        return ret;
 }
 
This page took 0.026218 seconds and 4 git commands to generate.