relayd: move relay_session locking outside of make_viewer_streams
[lttng-tools.git] / src / bin / lttng-relayd / viewer-session.c
index 6d74b351717dc695103127b178c2074dd142a54b..5f9c7c5769f799d5ff101446b730b06c340b5f4f 100644 (file)
@@ -47,12 +47,13 @@ int viewer_session_attach(struct relay_viewer_session *vsession,
 {
        int ret = 0;
 
+       ASSERT_LOCKED(session->lock);
+
        /* Will not fail, as per the ownership guarantee. */
        if (!session_get(session)) {
                ret = -1;
                goto end;
        }
-       pthread_mutex_lock(&session->lock);
        if (session->viewer_attached) {
                ret = -1;
        } else {
@@ -69,8 +70,6 @@ int viewer_session_attach(struct relay_viewer_session *vsession,
                /* Put our local ref. */
                session_put(session);
        }
-       /* Safe since we know the session exists. */
-       pthread_mutex_unlock(&session->lock);
 end:
        return ret;
 }
@@ -105,6 +104,41 @@ void viewer_session_destroy(struct relay_viewer_session *vsession)
        free(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 lttng_ht_iter iter;
+       struct relay_viewer_stream *vstream;
+
+       /*
+        * 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) {
+                       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);
+       }
+
+       viewer_session_detach(vsession, session);
+}
+
 void viewer_session_close(struct relay_viewer_session *vsession)
 {
        struct relay_session *session;
@@ -112,32 +146,7 @@ void viewer_session_close(struct relay_viewer_session *vsession)
        rcu_read_lock();
        cds_list_for_each_entry_rcu(session,
                        &vsession->session_list, viewer_session_node) {
-               struct lttng_ht_iter iter;
-               struct relay_viewer_stream *vstream;
-
-               /*
-                * 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) {
-                               viewer_stream_put(vstream);
-                               continue;
-                       }
-                       /* Put local reference. */
-                       viewer_stream_put(vstream);
-                       /*
-                        * We have reached one of the viewer stream's lifetime
-                        * end condition.
-                        */
-                       viewer_stream_put(vstream);
-               }
-
-               viewer_session_detach(vsession, session);
+               viewer_session_close_one_session(vsession, session);
        }
        rcu_read_unlock();
 }
This page took 0.024058 seconds and 4 git commands to generate.