Fix: sessiond: assertion fails when getting name of trigger
[lttng-tools.git] / src / bin / lttng-sessiond / ust-app.c
index 3a899775dcb62f15f75964626932cc535a570a71..5ab55ec29d3718b83a67135e3b6a155af8c74bfb 100644 (file)
@@ -952,6 +952,7 @@ void delete_ust_app(struct ust_app *app)
        struct ust_app_session *ua_sess, *tmp_ua_sess;
        struct lttng_ht_iter iter;
        struct ust_app_event_notifier_rule *event_notifier_rule;
+       bool event_notifier_write_fd_is_open;
 
        /*
         * The session list lock must be held during this function to guarantee
@@ -1009,7 +1010,16 @@ void delete_ust_app(struct ust_app *app)
                free(app->event_notifier_group.object);
        }
 
+       event_notifier_write_fd_is_open = lttng_pipe_is_write_open(
+                       app->event_notifier_group.event_pipe);
        lttng_pipe_destroy(app->event_notifier_group.event_pipe);
+       /*
+        * Release the file descriptors reserved for the event notifier pipe.
+        * The app could be destroyed before the write end of the pipe could be
+        * passed to the application (and closed). In that case, both file
+        * descriptors must be released.
+        */
+       lttng_fd_put(LTTNG_FD_APPS, event_notifier_write_fd_is_open ? 2 : 1);
 
        /*
         * Wait until we have deleted the application from the sock hash table
@@ -3708,6 +3718,7 @@ error:
  */
 struct ust_app *ust_app_create(struct ust_register_msg *msg, int sock)
 {
+       int ret;
        struct ust_app *lta = NULL;
        struct lttng_pipe *event_notifier_event_source_pipe = NULL;
 
@@ -3726,6 +3737,18 @@ struct ust_app *ust_app_create(struct ust_register_msg *msg, int sock)
                goto error;
        }
 
+       /*
+        * Reserve the two file descriptors of the event source pipe. The write
+        * end will be closed once it is passed to the application, at which
+        * point a single 'put' will be performed.
+        */
+       ret = lttng_fd_get(LTTNG_FD_APPS, 2);
+       if (ret) {
+               ERR("Failed to reserve two file descriptors for the event source pipe while creating a new application instance: app = '%s' (ppid: %d)",
+                               msg->name, (int) msg->ppid);
+               goto error;
+       }
+
        event_notifier_event_source_pipe = lttng_pipe_open(FD_CLOEXEC);
        if (!event_notifier_event_source_pipe) {
                PERROR("Failed to open application event source pipe: '%s' (ppid = %d)",
@@ -3783,6 +3806,7 @@ struct ust_app *ust_app_create(struct ust_register_msg *msg, int sock)
 
 error_free_pipe:
        lttng_pipe_destroy(event_notifier_event_source_pipe);
+       lttng_fd_put(LTTNG_FD_APPS, 2);
 error:
        return NULL;
 }
@@ -3885,6 +3909,19 @@ int ust_app_setup_event_notifier_group(struct ust_app *app)
                goto error;
        }
 
+       ret = lttng_pipe_write_close(app->event_notifier_group.event_pipe);
+       if (ret) {
+               ERR("Failed to close write end of the application's event source pipe: app = '%s' (ppid = %d)",
+                               app->name, app->ppid);
+               goto error;
+       }
+
+       /*
+        * Release the file descriptor that was reserved for the write-end of
+        * the pipe.
+        */
+       lttng_fd_put(LTTNG_FD_APPS, 1);
+
        lttng_ret = notification_thread_command_add_tracer_event_source(
                        notification_thread_handle,
                        lttng_pipe_get_readfd(app->event_notifier_group.event_pipe),
@@ -4314,16 +4351,12 @@ void ust_app_clean_list(void)
        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;
-                       }
+                       /*
+                        * Assert that all notifiers are gone as all triggers
+                        * are unregistered prior to this clean-up.
+                        */
+                       assert(lttng_ht_get_count(app->token_to_event_notifier_rule_ht) == 0);
 
-                       app = container_of(node, struct ust_app,
-                                       notify_sock_n.node);
                        ust_app_notify_sock_unregister(app->notify_sock);
                }
        }
This page took 0.023988 seconds and 4 git commands to generate.