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.
20 #include <common/common.h>
24 #include "viewer-stream.h"
26 static void rcu_destroy_stream(struct rcu_head
*head
)
28 struct relay_stream
*stream
=
29 caa_container_of(head
, struct relay_stream
, rcu_node
);
31 free(stream
->path_name
);
32 free(stream
->channel_name
);
37 * Get stream from stream id from the given hash table. Return stream if found
40 * Need to be called with RCU read-side lock held.
42 struct relay_stream
*stream_find_by_id(struct lttng_ht
*ht
,
45 struct lttng_ht_node_u64
*node
;
46 struct lttng_ht_iter iter
;
47 struct relay_stream
*stream
= NULL
;
51 lttng_ht_lookup(ht
, &stream_id
, &iter
);
52 node
= lttng_ht_iter_get_node_u64(&iter
);
54 DBG("Relay stream %" PRIu64
" not found", stream_id
);
57 stream
= caa_container_of(node
, struct relay_stream
, node
);
64 * Close a given stream. If an assosiated viewer stream exists it is updated.
66 * RCU read side lock MUST be acquired.
68 * Return 0 if close was successful or 1 if already closed.
70 int stream_close(struct relay_session
*session
, struct relay_stream
*stream
)
73 struct relay_viewer_stream
*vstream
;
74 struct ctf_trace
*ctf_trace
;
78 pthread_mutex_lock(&stream
->lock
);
80 if (stream
->terminated_flag
) {
81 /* This stream is already closed. Ignore. */
86 DBG("Closing stream id %" PRIu64
, stream
->stream_handle
);
88 if (stream
->fd
>= 0) {
89 delret
= close(stream
->fd
);
91 PERROR("close stream");
95 if (stream
->index_fd
>= 0) {
96 delret
= close(stream
->index_fd
);
98 PERROR("close stream index_fd");
102 vstream
= viewer_stream_find_by_id(stream
->stream_handle
);
105 * Set the last good value into the viewer stream. This is done
106 * right before the stream gets deleted from the hash table. The
107 * lookup failure on the live thread side of a stream indicates
108 * that the viewer stream index received value should be used.
110 pthread_mutex_lock(&stream
->viewer_stream_rotation_lock
);
111 vstream
->total_index_received
= stream
->total_index_received
;
112 vstream
->tracefile_count_last
= stream
->tracefile_count_current
;
113 vstream
->close_write_flag
= 1;
114 pthread_mutex_unlock(&stream
->viewer_stream_rotation_lock
);
117 /* Cleanup index of that stream. */
118 relay_index_destroy_by_stream_id(stream
->stream_handle
);
120 ctf_trace
= ctf_trace_find_by_path(session
->ctf_traces_ht
,
123 ctf_trace_put_ref(ctf_trace
);
125 stream
->close_flag
= 1;
126 stream
->terminated_flag
= 1;
130 pthread_mutex_unlock(&stream
->lock
);
134 void stream_delete(struct lttng_ht
*ht
, struct relay_stream
*stream
)
137 struct lttng_ht_iter iter
;
142 iter
.iter
.node
= &stream
->node
.node
;
143 ret
= lttng_ht_del(ht
, &iter
);
146 cds_list_del(&stream
->trace_list
);
149 void stream_destroy(struct relay_stream
*stream
)
153 call_rcu(&stream
->rcu_node
, rcu_destroy_stream
);