Fix: perform a rotation to a null trace chunk on session destruction
[lttng-tools.git] / src / bin / lttng-sessiond / session.c
index 09953b48218d6b592d4f8e1ad4d69ef0461ab3d7..6e187f2ff51df9c17fb162f0096e7e6a92d7a372 100644 (file)
@@ -39,6 +39,7 @@
 #include "utils.h"
 #include "trace-ust.h"
 #include "timer.h"
+#include "cmd.h"
 
 struct ltt_session_destroy_notifier_element {
        ltt_session_destroy_notifier notifier;
@@ -794,27 +795,13 @@ void session_release(struct urcu_ref *ref)
        struct ltt_ust_session *usess;
        struct ltt_kernel_session *ksess;
        struct ltt_session *session = container_of(ref, typeof(*session), ref);
+       const bool session_published = session->published;
 
        assert(!session->chunk_being_archived);
 
        usess = session->ust_session;
        ksess = session->kernel_session;
 
-       session_notify_destruction(session);
-       lttng_dynamic_array_reset(&session->destroy_notifiers);
-       if (session->current_trace_chunk) {
-               ret = session_close_trace_chunk(session, session->current_trace_chunk, NULL);
-               if (ret) {
-                       ERR("Failed to close the current trace chunk of session \"%s\" during its release",
-                                       session->name);
-               }
-               ret = _session_set_trace_chunk_no_lock_check(session, NULL, NULL);
-               if (ret) {
-                       ERR("Failed to release the current trace chunk of session \"%s\" during its release",
-                                       session->name);
-               }
-        }
-
         /* Clean kernel session teardown */
        kernel_destroy_session(ksess);
        session->kernel_session = NULL;
@@ -851,14 +838,22 @@ void session_release(struct urcu_ref *ref)
 
        pthread_mutex_destroy(&session->lock);
 
-       if (session->published) {
+       if (session_published) {
                ASSERT_LOCKED(ltt_session_list.lock);
                del_session_list(session);
                del_session_ht(session);
-               pthread_cond_broadcast(&ltt_session_list.removal_cond);
        }
+       session_notify_destruction(session);
+       lttng_dynamic_array_reset(&session->destroy_notifiers);
        free(session->last_archived_chunk_name);
        free(session);
+       if (session_published) {
+               /*
+                * Broadcast after free-ing to ensure the memory is
+                * reclaimed before the main thread exits.
+                */
+               pthread_cond_broadcast(&ltt_session_list.removal_cond);
+       }
 }
 
 /*
This page took 0.023519 seconds and 4 git commands to generate.