X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fsession.c;h=6e187f2ff51df9c17fb162f0096e7e6a92d7a372;hb=ce75e27ac20a5eb37fd1334e88a59a0cb91cb397;hp=c4692504b5cd589d370e2ce917117b0b00d71eb1;hpb=e2b6b28eb86b7d0391a514f174a566a459b41136;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/session.c b/src/bin/lttng-sessiond/session.c index c4692504b..6e187f2ff 100644 --- a/src/bin/lttng-sessiond/session.c +++ b/src/bin/lttng-sessiond/session.c @@ -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; @@ -715,12 +716,15 @@ int session_close_trace_chunk(const struct ltt_session *session, } if (session->ust_session) { + const uint64_t relayd_id = + session->ust_session->consumer->net_seq_index; + cds_lfht_for_each_entry( session->ust_session->consumer->socks->ht, &iter, socket, node.node) { pthread_mutex_lock(socket->lock); ret = consumer_close_trace_chunk(socket, - session->consumer->net_seq_index, + relayd_id, session->id, trace_chunk); pthread_mutex_unlock(socket->lock); @@ -731,12 +735,15 @@ int session_close_trace_chunk(const struct ltt_session *session, } } if (session->kernel_session) { + const uint64_t relayd_id = + session->kernel_session->consumer->net_seq_index; + cds_lfht_for_each_entry( session->kernel_session->consumer->socks->ht, &iter, socket, node.node) { pthread_mutex_lock(socket->lock); ret = consumer_close_trace_chunk(socket, - session->consumer->net_seq_index, + relayd_id, session->id, trace_chunk); pthread_mutex_unlock(socket->lock); @@ -788,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; @@ -845,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(<t_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(<t_session_list.removal_cond); + } } /*