fix: relayd: unaligned access in trace_chunk_registry_ht_key_hash
[lttng-tools.git] / src / bin / lttng-relayd / viewer-session.cpp
index ac14dbff0cf8fcf3d042775f0d0335febdfb4db5..45fa2dcacafff947a43de2945c948bf994694cd1 100644 (file)
@@ -8,21 +8,23 @@
  */
 
 #define _LGPL_SOURCE
-#include <common/common.h>
-#include <urcu/rculist.h>
+#include "ctf-trace.hpp"
+#include "lttng-relayd.hpp"
+#include "session.hpp"
+#include "stream.hpp"
+#include "viewer-session.hpp"
+#include "viewer-stream.hpp"
+
+#include <common/common.hpp>
+#include <common/urcu.hpp>
 
-#include "lttng-relayd.h"
-#include "ctf-trace.h"
-#include "session.h"
-#include "viewer-session.h"
-#include "viewer-stream.h"
-#include "stream.h"
+#include <urcu/rculist.h>
 
-struct relay_viewer_session *viewer_session_create(void)
+struct relay_viewer_session *viewer_session_create()
 {
        struct relay_viewer_session *vsession;
 
-       vsession = (relay_viewer_session *) zmalloc(sizeof(*vsession));
+       vsession = zmalloc<relay_viewer_session>();
        if (!vsession) {
                goto end;
        }
@@ -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;
This page took 0.026431 seconds and 4 git commands to generate.