Perform the clean-up of application notify sockets in main thread
[lttng-tools.git] / src / bin / lttng-sessiond / ust-app.c
index 7b44fb4b48a050927fe2c897650dd2fda156dfac..8c5f3f6afc0e3dfdb7ad225f2963bce7bd526624 100644 (file)
@@ -437,6 +437,9 @@ void save_per_pid_lost_discarded_counters(struct ust_app_channel *ua_chan)
 
 end:
        rcu_read_unlock();
+       if (session) {
+               session_put(session);
+       }
 }
 
 /*
@@ -2865,7 +2868,7 @@ static int create_channel_per_uid(struct ust_app *app,
        int ret;
        struct buffer_reg_uid *reg_uid;
        struct buffer_reg_channel *reg_chan;
-       struct ltt_session *session;
+       struct ltt_session *session = NULL;
        enum lttng_error_code notification_ret;
        struct ust_registry_channel *chan_reg;
 
@@ -2968,6 +2971,9 @@ send_channel:
        }
 
 error:
+       if (session) {
+               session_put(session);
+       }
        return ret;
 }
 
@@ -2986,7 +2992,7 @@ static int create_channel_per_pid(struct ust_app *app,
        int ret;
        struct ust_registry_session *registry;
        enum lttng_error_code cmd_ret;
-       struct ltt_session *session;
+       struct ltt_session *session = NULL;
        uint64_t chan_reg_key;
        struct ust_registry_channel *chan_reg;
 
@@ -3061,6 +3067,9 @@ error_remove_from_registry:
        }
 error:
        rcu_read_unlock();
+       if (session) {
+               session_put(session);
+       }
        return ret;
 }
 
@@ -3251,7 +3260,7 @@ static int create_ust_app_metadata(struct ust_app_session *ua_sess,
        struct ust_app_channel *metadata;
        struct consumer_socket *socket;
        struct ust_registry_session *registry;
-       struct ltt_session *session;
+       struct ltt_session *session = NULL;
 
        assert(ua_sess);
        assert(app);
@@ -3342,6 +3351,9 @@ error_consumer:
        delete_ust_app_channel(-1, metadata, app);
 error:
        pthread_mutex_unlock(&registry->lock);
+       if (session) {
+               session_put(session);
+       }
        return ret;
 }
 
@@ -3909,6 +3921,24 @@ void ust_app_clean_list(void)
 
        rcu_read_lock();
 
+       /* Cleanup notify socket hash table */
+       if (ust_app_ht_by_notify_sock) {
+               cds_lfht_for_each_entry(ust_app_ht_by_notify_sock->ht, &iter.iter, app,
+                               notify_sock_n.node) {
+                       struct cds_lfht_node *node;
+                       struct ust_app *app;
+
+                       node = cds_lfht_iter_get_node(&iter.iter);
+                       if (!node) {
+                               continue;
+                       }
+
+                       app = container_of(node, struct ust_app,
+                                       notify_sock_n.node);
+                       ust_app_notify_sock_unregister(app->notify_sock);
+               }
+       }
+
        if (ust_app_ht) {
                cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
                        ret = lttng_ht_del(ust_app_ht, &iter);
@@ -3926,14 +3956,6 @@ void ust_app_clean_list(void)
                }
        }
 
-       /* Cleanup notify socket hash table */
-       if (ust_app_ht_by_notify_sock) {
-               cds_lfht_for_each_entry(ust_app_ht_by_notify_sock->ht, &iter.iter, app,
-                               notify_sock_n.node) {
-                       ret = lttng_ht_del(ust_app_ht_by_notify_sock, &iter);
-                       assert(!ret);
-               }
-       }
        rcu_read_unlock();
 
        /* Destroy is done only when the ht is empty */
@@ -5963,7 +5985,7 @@ enum lttng_error_code ust_app_snapshot_record(struct ltt_ust_session *usess,
        struct lttng_ht_iter iter;
        struct ust_app *app;
        char pathname[PATH_MAX];
-       struct ltt_session *session;
+       struct ltt_session *session = NULL;
        uint64_t trace_archive_id;
 
        assert(usess);
@@ -6111,6 +6133,9 @@ enum lttng_error_code ust_app_snapshot_record(struct ltt_ust_session *usess,
 
 error:
        rcu_read_unlock();
+       if (session) {
+               session_put(session);
+       }
        return status;
 }
 
This page took 0.026701 seconds and 5 git commands to generate.