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
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;
handle->rotation_timer_queue = rotation_timer_queue;
handle->notification_thread_handle = notification_thread_handle;
- handle->notification_thread_ready = notification_thread_ready;
end:
return 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) {
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);
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);