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;
} else {
handle->channel_monitoring_pipes.kernel_consumer = -1;
}
+ handle->notification_thread_ready = notification_thread_ready;
end:
return handle;
error:
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);
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) {
if (!state->triggers_ht) {
goto error;
}
+ sem_post(handle->notification_thread_ready);
end:
return 0;
error: