2 * Copyright (C) 2013 - Julien Desfossez <jdesfossez@efficios.com>
3 * David Goulet <dgoulet@efficios.com>
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License, version 2 only, as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc., 51
16 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #include <common/common.h>
23 #include "ctf-trace.h"
27 /* Global session id used in the session creation. */
28 static uint64_t last_relay_session_id
;
30 static void rcu_destroy_session(struct rcu_head
*head
)
32 struct relay_session
*session
=
33 caa_container_of(head
, struct relay_session
, rcu_node
);
39 * Create a new session by assigning a new session ID.
41 * Return allocated session or else NULL.
43 struct relay_session
*session_create(void)
45 struct relay_session
*session
;
47 session
= zmalloc(sizeof(*session
));
49 PERROR("relay session zmalloc");
53 session
->ctf_traces_ht
= lttng_ht_new(0, LTTNG_HT_TYPE_STRING
);
54 if (!session
->ctf_traces_ht
) {
60 pthread_mutex_init(&session
->viewer_ready_lock
, NULL
);
61 session
->id
= ++last_relay_session_id
;
62 lttng_ht_node_init_u64(&session
->session_n
, session
->id
);
69 * Lookup a session within the given hash table and session id. RCU read side
70 * lock MUST be acquired before calling this and as long as the caller has a
71 * reference to the object.
73 * Return session or NULL if not found.
75 struct relay_session
*session_find_by_id(struct lttng_ht
*ht
, uint64_t id
)
77 struct relay_session
*session
= NULL
;
78 struct lttng_ht_node_u64
*node
;
79 struct lttng_ht_iter iter
;
83 lttng_ht_lookup(ht
, &id
, &iter
);
84 node
= lttng_ht_iter_get_node_u64(&iter
);
86 DBG("Session find by ID %" PRIu64
" id NOT found", id
);
89 session
= caa_container_of(node
, struct relay_session
, session_n
);
90 DBG("Session find by ID %" PRIu64
" id found", id
);
97 * Delete session from the given hash table.
99 * Return lttng ht del error code being 0 on success and 1 on failure.
101 int session_delete(struct lttng_ht
*ht
, struct relay_session
*session
)
103 struct lttng_ht_iter iter
;
108 iter
.iter
.node
= &session
->session_n
.node
;
109 return lttng_ht_del(ht
, &iter
);
113 * The caller MUST be from the viewer thread since the viewer refcount is
114 * decremented. With this calue down to 0, it will try to destroy the session.
116 void session_viewer_try_destroy(struct lttng_ht
*ht
,
117 struct relay_session
*session
)
119 unsigned long ret_ref
;
123 ret_ref
= uatomic_add_return(&session
->viewer_refcount
, -1);
125 session_try_destroy(ht
, session
);
130 * Should only be called from the main streaming thread since it does not touch
131 * the viewer refcount. If this refcount is down to 0, destroy the session only
132 * and only if the session deletion succeeds. This is done because the viewer
133 * *and* the streaming thread can both concurently try to destroy the session
134 * thus the first come first serve.
136 void session_try_destroy(struct lttng_ht
*ht
, struct relay_session
*session
)
139 unsigned long ret_ref
;
143 ret_ref
= uatomic_read(&session
->viewer_refcount
);
144 if (ret_ref
== 0 && session
->close_flag
) {
146 ret
= session_delete(ht
, session
);
149 /* Only destroy the session if the deletion was successful. */
150 session_destroy(session
);
156 * Destroy a session object.
158 * This function must *NOT* be called with an RCU read lock held since
159 * the session's ctf_traces_ht is destroyed.
161 void session_destroy(struct relay_session
*session
)
163 struct ctf_trace
*ctf_trace
;
164 struct lttng_ht_iter iter
;
168 DBG("Relay destroying session %" PRIu64
, session
->id
);
171 * Empty the ctf trace hash table which will destroy the stream contained
175 cds_lfht_for_each_entry(session
->ctf_traces_ht
->ht
, &iter
.iter
, ctf_trace
,
177 ctf_trace_delete(session
->ctf_traces_ht
, ctf_trace
);
178 ctf_trace_destroy(ctf_trace
);
181 lttng_ht_destroy(session
->ctf_traces_ht
);
183 call_rcu(&session
->rcu_node
, rcu_destroy_session
);
This page took 0.0358270000000001 seconds and 4 git commands to generate.