Stop rotation pending check timer from the rotation thread
[lttng-tools.git] / src / bin / lttng-sessiond / rotation-thread.c
index 64f958233cdc6ccb22ee671a5d5feb51fd6cae67..a0b924865d3e02fe04fc5ebd5c2517cb69ee165e 100644 (file)
@@ -75,7 +75,6 @@ struct rotation_thread_handle {
        struct rotation_thread_timer_queue *rotation_timer_queue;
        /* Access to the notification thread cmd_queue */
        struct notification_thread_handle *notification_thread_handle;
-       sem_t *notification_thread_ready;
 };
 
 static
@@ -169,8 +168,7 @@ void rotation_thread_handle_destroy(
 
 struct rotation_thread_handle *rotation_thread_handle_create(
                struct rotation_thread_timer_queue *rotation_timer_queue,
-               struct notification_thread_handle *notification_thread_handle,
-               sem_t *notification_thread_ready)
+               struct notification_thread_handle *notification_thread_handle)
 {
        struct rotation_thread_handle *handle;
 
@@ -181,7 +179,6 @@ struct rotation_thread_handle *rotation_thread_handle_create(
 
        handle->rotation_timer_queue = rotation_timer_queue;
        handle->notification_thread_handle = notification_thread_handle;
-       handle->notification_thread_ready = notification_thread_ready;
 
 end:
        return handle;
@@ -320,11 +317,6 @@ int init_thread_state(struct rotation_thread_handle *handle,
                goto end;
        }
 
-       /*
-        * We wait until the notification thread is ready to create the
-        * notification channel and add it to the poll_set.
-        */
-       sem_wait(handle->notification_thread_ready);
        rotate_notification_channel = lttng_notification_channel_create(
                        lttng_session_daemon_notification_endpoint);
        if (!rotate_notification_channel) {
@@ -535,6 +527,19 @@ int check_session_rotation_pending(struct ltt_session *session,
        DBG("[rotation-thread] Checking for pending rotation on session \"%s\", trace archive %" PRIu64,
                        session->name, session->current_archive_id - 1);
 
+       /*
+        * The rotation-pending check timer of a session is launched in
+        * one-shot mode. If the rotation is incomplete, the rotation
+        * thread will re-enable the pending-check timer.
+        *
+        * The timer thread can't stop the timer itself since it is involved
+        * in the check for the timer's quiescence.
+        */
+       ret = timer_session_rotation_pending_check_stop(session);
+       if (ret) {
+               goto end;
+       }
+
        if (session->rotation_pending_local) {
                /* Updates session->rotation_pending_local as needed. */
                ret = check_session_rotation_pending_local(session);
@@ -759,6 +764,7 @@ int handle_job_queue(struct rotation_thread_handle *handle,
                session_lock(session);
                ret = run_job(job, session, handle->notification_thread_handle);
                session_unlock(session);
+               /* Release reference held by the job. */
                session_put(session);
                session_unlock_list();
                free(job);
This page took 0.023987 seconds and 4 git commands to generate.