2 * Copyright (C) 2013 - Julien Desfossez <jdesfossez@efficios.com>
3 * David Goulet <dgoulet@efficios.com>
4 * 2015 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License, version 2 only, as
8 * published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc., 51
17 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #include <common/common.h>
22 #include <urcu/rculist.h>
24 #include "lttng-relayd.h"
25 #include "ctf-trace.h"
27 #include "viewer-session.h"
28 #include "viewer-stream.h"
31 struct relay_viewer_session
*viewer_session_create(void)
33 struct relay_viewer_session
*vsession
;
35 vsession
= zmalloc(sizeof(*vsession
));
39 CDS_INIT_LIST_HEAD(&vsession
->session_list
);
44 /* The existence of session must be guaranteed by the caller. */
45 int viewer_session_attach(struct relay_viewer_session
*vsession
,
46 struct relay_session
*session
)
50 /* Will not fail, as per the ownership guarantee. */
51 if (!session_get(session
)) {
55 pthread_mutex_lock(&session
->lock
);
56 if (session
->viewer_attached
) {
59 session
->viewer_attached
= true;
63 pthread_mutex_lock(&vsession
->session_list_lock
);
64 /* Ownership is transfered to the list. */
65 cds_list_add_rcu(&session
->viewer_session_node
,
66 &vsession
->session_list
);
67 pthread_mutex_unlock(&vsession
->session_list_lock
);
69 /* Put our local ref. */
72 /* Safe since we know the session exists. */
73 pthread_mutex_unlock(&session
->lock
);
78 /* The existence of session must be guaranteed by the caller. */
79 static int viewer_session_detach(struct relay_viewer_session
*vsession
,
80 struct relay_session
*session
)
84 pthread_mutex_lock(&session
->lock
);
85 if (!session
->viewer_attached
) {
88 session
->viewer_attached
= false;
92 pthread_mutex_lock(&vsession
->session_list_lock
);
93 cds_list_del_rcu(&session
->viewer_session_node
);
94 pthread_mutex_unlock(&vsession
->session_list_lock
);
95 /* Release reference held by the list. */
98 /* Safe since we know the session exists. */
99 pthread_mutex_unlock(&session
->lock
);
103 void viewer_session_destroy(struct relay_viewer_session
*vsession
)
108 void viewer_session_close(struct relay_viewer_session
*vsession
)
110 struct relay_session
*session
;
113 cds_list_for_each_entry_rcu(session
,
114 &vsession
->session_list
, viewer_session_node
) {
115 struct lttng_ht_iter iter
;
116 struct relay_viewer_stream
*vstream
;
119 * TODO: improvement: create more efficient list of
120 * vstream per session.
122 cds_lfht_for_each_entry(viewer_streams_ht
->ht
, &iter
.iter
,
123 vstream
, stream_n
.node
) {
124 if (!viewer_stream_get(vstream
)) {
127 if (vstream
->stream
->trace
->session
!= session
) {
128 viewer_stream_put(vstream
);
131 /* Put local reference. */
132 viewer_stream_put(vstream
);
134 * We have reached one of the viewer stream's lifetime
137 viewer_stream_put(vstream
);
140 viewer_session_detach(vsession
, session
);
146 * Check if a connection is attached to a session.
147 * Return 1 if attached, 0 if not attached, a negative value on error.
149 int viewer_session_is_attached(struct relay_viewer_session
*vsession
,
150 struct relay_session
*session
)
152 struct relay_session
*iter
;
155 pthread_mutex_lock(&session
->lock
);
159 if (!session
->viewer_attached
) {
163 cds_list_for_each_entry_rcu(iter
,
164 &vsession
->session_list
,
165 viewer_session_node
) {
166 if (session
== iter
) {
174 pthread_mutex_unlock(&session
->lock
);
This page took 0.033154 seconds and 4 git commands to generate.