Size-based rotation
[lttng-tools.git] / src / bin / lttng-sessiond / main.c
index cec3a504a01371aed72f81f419f43a66539ba162..4c885d7b74f63f2c51447932fe36afccabb81d8e 100644 (file)
@@ -595,7 +595,8 @@ static void sessiond_cleanup(void)
                /* Cleanup ALL session */
                cds_list_for_each_entry_safe(sess, stmp,
                                &session_list_ptr->head, list) {
-                       cmd_destroy_session(sess, kernel_poll_pipe[1]);
+                       cmd_destroy_session(sess, kernel_poll_pipe[1],
+                                       notification_thread_handle);
                }
        }
 
@@ -3771,7 +3772,8 @@ error_add_context:
        }
        case LTTNG_DESTROY_SESSION:
        {
-               ret = cmd_destroy_session(cmd_ctx->session, kernel_poll_pipe[1]);
+               ret = cmd_destroy_session(cmd_ctx->session, kernel_poll_pipe[1],
+                               notification_thread_handle);
 
                /* Set session to NULL so we do not unlock it after free. */
                cmd_ctx->session = NULL;
@@ -4200,7 +4202,8 @@ error_add_context:
 
                ret = cmd_rotation_set_schedule(cmd_ctx->session,
                                cmd_ctx->lsm->u.rotate_setup.timer_us,
-                               cmd_ctx->lsm->u.rotate_setup.size);
+                               cmd_ctx->lsm->u.rotate_setup.size,
+                               notification_thread_handle);
                if (ret < 0) {
                        ret = -ret;
                        goto error;
@@ -5709,6 +5712,7 @@ int main(int argc, char **argv)
        struct timer_thread_parameters timer_thread_ctx;
        /* Queue of rotation jobs populated by the sessiond-timer. */
        struct rotation_thread_timer_queue *rotation_timer_queue = NULL;
+       sem_t notification_thread_ready;
 
        init_kernel_workarounds();
 
@@ -6116,11 +6120,19 @@ int main(int argc, char **argv)
                goto exit_health;
        }
 
+       /*
+        * The rotation thread needs the notification thread to be ready before
+        * creating the rotate_notification_channel, so we use this semaphore as
+        * a rendez-vous point.
+        */
+       sem_init(&notification_thread_ready, 0, 0);
+
        /* notification_thread_data acquires the pipes' read side. */
        notification_thread_handle = notification_thread_handle_create(
                        ust32_channel_monitor_pipe,
                        ust64_channel_monitor_pipe,
-                       kernel_channel_monitor_pipe);
+                       kernel_channel_monitor_pipe,
+                       &notification_thread_ready);
        if (!notification_thread_handle) {
                retval = -1;
                ERR("Failed to create notification thread shared data");
@@ -6158,7 +6170,9 @@ int main(int argc, char **argv)
                        ust64_channel_rotate_pipe,
                        kernel_channel_rotate_pipe,
                        thread_quit_pipe[0],
-                       rotation_timer_queue);
+                       rotation_timer_queue,
+                       notification_thread_handle,
+                       &notification_thread_ready);
        if (!rotation_thread_handle) {
                retval = -1;
                ERR("Failed to create rotation thread shared data");
@@ -6346,6 +6360,7 @@ exit_dispatch:
 exit_client:
 exit_rotation:
 exit_notification:
+       sem_destroy(&notification_thread_ready);
        ret = pthread_join(health_thread, &status);
        if (ret) {
                errno = ret;
This page took 0.024541 seconds and 4 git commands to generate.