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);
struct ltt_session *session =
(struct ltt_session *) info.si_value.sival_ptr;
- session_lock_list();
- session_lock(session);
- /* Acquires a reference to the session. */
rotation_thread_enqueue_job(ctx->rotation_thread_job_queue,
ROTATION_THREAD_JOB_TYPE_CHECK_PENDING_ROTATION,
session);
- /* Release the timer's reference to the session. */
- (void) timer_session_rotation_pending_check_stop(session);
- session_unlock_list();
} else if (signr == LTTNG_SESSIOND_SIG_SCHEDULED_ROTATION) {
rotation_thread_enqueue_job(ctx->rotation_thread_job_queue,
ROTATION_THREAD_JOB_TYPE_SCHEDULED_ROTATION,