X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Frotation-thread.c;h=a0b924865d3e02fe04fc5ebd5c2517cb69ee165e;hp=64f958233cdc6ccb22ee671a5d5feb51fd6cae67;hb=faf1bdcfa4aedc89c3c9777bd9453e4b7f20b193;hpb=c7031a2c707646804e0088d069578d5eb74fc01e diff --git a/src/bin/lttng-sessiond/rotation-thread.c b/src/bin/lttng-sessiond/rotation-thread.c index 64f958233..a0b924865 100644 --- a/src/bin/lttng-sessiond/rotation-thread.c +++ b/src/bin/lttng-sessiond/rotation-thread.c @@ -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);