X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fbin%2Flttng-relayd%2Fsession.c;h=51b1a3497641549af8faab3775bc76fd02f795c9;hb=f39bd140151b845f44abd6a7079eaaf5cfed1c89;hp=f76fb4a42e7606b8ebfea427033b00e3de192020;hpb=98ba050ed140ff29ac98f66dba0e47db70e4a0c5;p=lttng-tools.git diff --git a/src/bin/lttng-relayd/session.c b/src/bin/lttng-relayd/session.c index f76fb4a42..51b1a3497 100644 --- a/src/bin/lttng-relayd/session.c +++ b/src/bin/lttng-relayd/session.c @@ -25,6 +25,7 @@ #include "ctf-trace.h" #include "session.h" #include "stream.h" +#include "sessiond-trace-chunks.h" /* Global session id used in the session creation. */ static uint64_t last_relay_session_id; @@ -37,8 +38,10 @@ static pthread_mutex_t last_relay_session_id_lock = PTHREAD_MUTEX_INITIALIZER; */ struct relay_session *session_create(const char *session_name, const char *hostname, uint32_t live_timer, - bool snapshot, uint32_t major, uint32_t minor) + bool snapshot, const lttng_uuid sessiond_uuid, + uint32_t major, uint32_t minor) { + int ret; struct relay_session *session; session = zmalloc(sizeof(*session)); @@ -69,11 +72,17 @@ struct relay_session *session_create(const char *session_name, urcu_ref_init(&session->ref); CDS_INIT_LIST_HEAD(&session->recv_list); pthread_mutex_init(&session->lock, NULL); - pthread_mutex_init(&session->reflock, NULL); pthread_mutex_init(&session->recv_list_lock, NULL); session->live_timer = live_timer; session->snapshot = snapshot; + lttng_uuid_copy(session->sessiond_uuid, sessiond_uuid); + + ret = sessiond_trace_chunk_registry_session_created( + sessiond_trace_chunk_registry, sessiond_uuid); + if (ret) { + goto error; + } lttng_ht_add_unique_u64(sessions_ht, &session->session_n); return session; @@ -86,16 +95,7 @@ error: /* Should be called with RCU read-side lock held. */ bool session_get(struct relay_session *session) { - bool has_ref = false; - - pthread_mutex_lock(&session->reflock); - if (session->ref.refcount != 0) { - has_ref = true; - urcu_ref_get(&session->ref); - } - pthread_mutex_unlock(&session->reflock); - - return has_ref; + return urcu_ref_get_unless_zero(&session->ref); } /* @@ -164,6 +164,12 @@ static void destroy_session(struct relay_session *session) ret = session_delete(session); assert(!ret); + lttng_trace_chunk_put(session->current_trace_chunk); + ret = sessiond_trace_chunk_registry_session_destroyed( + sessiond_trace_chunk_registry, session->sessiond_uuid); + assert(!ret); + lttng_trace_chunk_put(session->current_trace_chunk); + session->current_trace_chunk = NULL; call_rcu(&session->rcu_node, rcu_destroy_session); } @@ -178,9 +184,7 @@ void session_release(struct urcu_ref *ref) void session_put(struct relay_session *session) { rcu_read_lock(); - pthread_mutex_lock(&session->reflock); urcu_ref_put(&session->ref, session_release); - pthread_mutex_unlock(&session->reflock); rcu_read_unlock(); } @@ -194,16 +198,8 @@ int session_close(struct relay_session *session) pthread_mutex_lock(&session->lock); DBG("closing session %" PRIu64 ": is conn already closed %d", session->id, session->connection_closed); - if (session->connection_closed) { - ret = -1; - goto unlock; - } session->connection_closed = true; -unlock: pthread_mutex_unlock(&session->lock); - if (ret) { - return ret; - } rcu_read_lock(); cds_lfht_for_each_entry(session->ctf_traces_ht->ht, @@ -238,13 +234,7 @@ int session_abort(struct relay_session *session) pthread_mutex_lock(&session->lock); DBG("aborting session %" PRIu64, session->id); - if (session->aborted) { - ERR("session %" PRIu64 " is already aborted", session->id); - ret = -1; - goto unlock; - } session->aborted = true; -unlock: pthread_mutex_unlock(&session->lock); return ret; }