X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Fviewer-session.cpp;h=45fa2dcacafff947a43de2945c948bf994694cd1;hp=194073f598783e011cf8b852515e34dba05950a3;hb=HEAD;hpb=64803277bbdbe0a943360d918298a48157d9da55 diff --git a/src/bin/lttng-relayd/viewer-session.cpp b/src/bin/lttng-relayd/viewer-session.cpp index 194073f59..45fa2dcac 100644 --- a/src/bin/lttng-relayd/viewer-session.cpp +++ b/src/bin/lttng-relayd/viewer-session.cpp @@ -8,17 +8,19 @@ */ #define _LGPL_SOURCE -#include -#include - -#include "lttng-relayd.hpp" #include "ctf-trace.hpp" +#include "lttng-relayd.hpp" #include "session.hpp" +#include "stream.hpp" #include "viewer-session.hpp" #include "viewer-stream.hpp" -#include "stream.hpp" -struct relay_viewer_session *viewer_session_create(void) +#include +#include + +#include + +struct relay_viewer_session *viewer_session_create() { struct relay_viewer_session *vsession; @@ -32,13 +34,13 @@ end: } int viewer_session_set_trace_chunk_copy(struct relay_viewer_session *vsession, - struct lttng_trace_chunk *relay_session_trace_chunk) + struct lttng_trace_chunk *relay_session_trace_chunk) { int ret = 0; struct lttng_trace_chunk *viewer_chunk; lttng_trace_chunk_put(vsession->current_trace_chunk); - vsession->current_trace_chunk = NULL; + vsession->current_trace_chunk = nullptr; DBG("Copying relay session's current trace chunk to the viewer session"); if (!relay_session_trace_chunk) { @@ -58,12 +60,10 @@ end: } /* The existence of session must be guaranteed by the caller. */ -enum lttng_viewer_attach_return_code viewer_session_attach( - struct relay_viewer_session *vsession, - struct relay_session *session) +enum lttng_viewer_attach_return_code viewer_session_attach(struct relay_viewer_session *vsession, + struct relay_session *session) { - enum lttng_viewer_attach_return_code viewer_attach_status = - LTTNG_VIEWER_ATTACH_OK; + enum lttng_viewer_attach_return_code viewer_attach_status = LTTNG_VIEWER_ATTACH_OK; ASSERT_LOCKED(session->lock); @@ -79,8 +79,7 @@ enum lttng_viewer_attach_return_code viewer_session_attach( session->viewer_attached = true; - ret = viewer_session_set_trace_chunk_copy(vsession, - session->current_trace_chunk); + ret = viewer_session_set_trace_chunk_copy(vsession, session->current_trace_chunk); if (ret) { /* * The live protocol does not define a generic error @@ -89,7 +88,7 @@ enum lttng_viewer_attach_return_code viewer_session_attach( * failure as if the session didn't exist anymore. */ DBG("Failed to create a viewer trace chunk from the current trace chunk of session \"%s\", returning LTTNG_VIEWER_ATTACH_UNK", - session->session_name); + session->session_name); viewer_attach_status = LTTNG_VIEWER_ATTACH_UNK; } } @@ -97,8 +96,7 @@ enum lttng_viewer_attach_return_code viewer_session_attach( if (viewer_attach_status == LTTNG_VIEWER_ATTACH_OK) { pthread_mutex_lock(&vsession->session_list_lock); /* Ownership is transfered to the list. */ - cds_list_add_rcu(&session->viewer_session_node, - &vsession->session_list); + cds_list_add_rcu(&session->viewer_session_node, &vsession->session_list); pthread_mutex_unlock(&vsession->session_list_lock); } else { /* Put our local ref. */ @@ -110,7 +108,7 @@ end: /* The existence of session must be guaranteed by the caller. */ static int viewer_session_detach(struct relay_viewer_session *vsession, - struct relay_session *session) + struct relay_session *session) { int ret = 0; @@ -143,7 +141,7 @@ void viewer_session_destroy(struct relay_viewer_session *vsession) * Release ownership of all the streams of one session and detach the viewer. */ void viewer_session_close_one_session(struct relay_viewer_session *vsession, - struct relay_session *session) + struct relay_session *session) { struct lttng_ht_iter iter; struct relay_viewer_stream *vstream; @@ -152,26 +150,31 @@ void viewer_session_close_one_session(struct relay_viewer_session *vsession, * TODO: improvement: create more efficient list of * vstream per session. */ - cds_lfht_for_each_entry(viewer_streams_ht->ht, &iter.iter, - vstream, stream_n.node) { - if (!viewer_stream_get(vstream)) { - continue; - } - if (vstream->stream->trace->session != session) { + { + lttng::urcu::read_lock_guard read_guard; + + cds_lfht_for_each_entry ( + viewer_streams_ht->ht, &iter.iter, vstream, stream_n.node) { + if (!viewer_stream_get(vstream)) { + continue; + } + if (vstream->stream->trace->session != session) { + viewer_stream_put(vstream); + continue; + } + /* Put local reference. */ + viewer_stream_put(vstream); + /* + * We have reached one of the viewer stream's lifetime + * end condition. This "put" will cause the proper + * teardown of the viewer stream. + */ viewer_stream_put(vstream); - continue; } - /* Put local reference. */ - viewer_stream_put(vstream); - /* - * We have reached one of the viewer stream's lifetime - * end condition. This "put" will cause the proper - * teardown of the viewer stream. - */ - viewer_stream_put(vstream); } + lttng_trace_chunk_put(vsession->current_trace_chunk); - vsession->current_trace_chunk = NULL; + vsession->current_trace_chunk = nullptr; viewer_session_detach(vsession, session); } @@ -179,20 +182,21 @@ void viewer_session_close(struct relay_viewer_session *vsession) { struct relay_session *session; - rcu_read_lock(); - cds_list_for_each_entry_rcu(session, - &vsession->session_list, viewer_session_node) { - viewer_session_close_one_session(vsession, session); + { + lttng::urcu::read_lock_guard read_lock; + + cds_list_for_each_entry_rcu(session, &vsession->session_list, viewer_session_node) + { + viewer_session_close_one_session(vsession, session); + } } - rcu_read_unlock(); } /* * Check if a connection is attached to a session. * Return 1 if attached, 0 if not attached, a negative value on error. */ -int viewer_session_is_attached(struct relay_viewer_session *vsession, - struct relay_session *session) +int viewer_session_is_attached(struct relay_viewer_session *vsession, struct relay_session *session) { struct relay_session *iter; int found = 0; @@ -204,17 +208,18 @@ int viewer_session_is_attached(struct relay_viewer_session *vsession, if (!session->viewer_attached) { goto end; } - rcu_read_lock(); - cds_list_for_each_entry_rcu(iter, - &vsession->session_list, - viewer_session_node) { - if (session == iter) { - found = 1; - goto end_rcu_unlock; + + { + lttng::urcu::read_lock_guard read_lock; + cds_list_for_each_entry_rcu(iter, &vsession->session_list, viewer_session_node) + { + if (session == iter) { + found = 1; + break; + } } } -end_rcu_unlock: - rcu_read_unlock(); + end: pthread_mutex_unlock(&session->lock); return found;