Build a list of triggers applying to a given session on creation
[lttng-tools.git] / src / bin / lttng-sessiond / notification-thread.c
index b80e8b4f9f5ac81c28ac90a056d4f80325414a38..4ce38e180e106986ae630a0c85483e93568405a3 100644 (file)
@@ -85,7 +85,8 @@ end:
 struct notification_thread_handle *notification_thread_handle_create(
                struct lttng_pipe *ust32_channel_monitor_pipe,
                struct lttng_pipe *ust64_channel_monitor_pipe,
-               struct lttng_pipe *kernel_channel_monitor_pipe)
+               struct lttng_pipe *kernel_channel_monitor_pipe,
+               sem_t *notification_thread_ready)
 {
        int ret;
        struct notification_thread_handle *handle;
@@ -96,7 +97,7 @@ struct notification_thread_handle *notification_thread_handle_create(
                goto end;
        }
 
-       event_pipe = lttng_pipe_open(O_CLOEXEC);
+       event_pipe = lttng_pipe_open(FD_CLOEXEC);
        if (!event_pipe) {
                ERR("event_pipe creation");
                goto error;
@@ -141,6 +142,7 @@ struct notification_thread_handle *notification_thread_handle_create(
        } else {
                handle->channel_monitoring_pipes.kernel_consumer = -1;
        }
+       handle->notification_thread_ready = notification_thread_ready;
 end:
        return handle;
 error:
@@ -350,11 +352,21 @@ void fini_thread_state(struct notification_thread_state *state)
                assert(!ret);
        }
        if (state->channels_ht) {
-               ret = cds_lfht_destroy(state->channels_ht,
-                               NULL);
+               ret = cds_lfht_destroy(state->channels_ht, NULL);
+               assert(!ret);
+       }
+       if (state->sessions_ht) {
+               ret = cds_lfht_destroy(state->sessions_ht, NULL);
+               assert(!ret);
+       }
+       /*
+        * Must be destroyed after all channels have been destroyed.
+        * See comment in struct lttng_session_trigger_list.
+        */
+       if (state->session_triggers_ht) {
+               ret = cds_lfht_destroy(state->session_triggers_ht, NULL);
                assert(!ret);
        }
-
        if (state->notification_channel_socket >= 0) {
                notification_channel_socket_destroy(
                                state->notification_channel_socket);
@@ -403,6 +415,12 @@ int init_thread_state(struct notification_thread_handle *handle,
                goto error;
        }
 
+       state->session_triggers_ht = cds_lfht_new(DEFAULT_HT_SIZE, 1, 0,
+                       CDS_LFHT_AUTO_RESIZE | CDS_LFHT_ACCOUNTING, NULL);
+       if (!state->session_triggers_ht) {
+               goto error;
+       }
+
        state->channel_state_ht = cds_lfht_new(DEFAULT_HT_SIZE, 1, 0,
                        CDS_LFHT_AUTO_RESIZE | CDS_LFHT_ACCOUNTING, NULL);
        if (!state->channel_state_ht) {
@@ -420,12 +438,17 @@ int init_thread_state(struct notification_thread_handle *handle,
        if (!state->channels_ht) {
                goto error;
        }
-
+       state->sessions_ht = cds_lfht_new(DEFAULT_HT_SIZE,
+                       1, 0, CDS_LFHT_AUTO_RESIZE | CDS_LFHT_ACCOUNTING, NULL);
+       if (!state->sessions_ht) {
+               goto error;
+       }
        state->triggers_ht = cds_lfht_new(DEFAULT_HT_SIZE,
                        1, 0, CDS_LFHT_AUTO_RESIZE | CDS_LFHT_ACCOUNTING, NULL);
        if (!state->triggers_ht) {
                goto error;
        }
+       sem_post(handle->notification_thread_ready);
 end:
        return 0;
 error:
This page took 0.025445 seconds and 5 git commands to generate.