/* Global relay stream hash table. */
struct lttng_ht *relay_streams_ht;
+/* Global relay viewer stream hash table. */
+struct lttng_ht *viewer_streams_ht;
+
/*
* usage function on stderr
*/
free(session);
}
-static void close_stream(struct relay_stream *stream,
- struct lttng_ht *viewer_streams_ht, struct lttng_ht *ctf_traces_ht)
+/*
+ * Close a given stream. The stream is freed using a call RCU.
+ *
+ * RCU read side lock MUST be acquired. If NO close_stream_check() was called
+ * BEFORE the stream lock MUST be acquired.
+ */
+static void destroy_stream(struct relay_stream *stream,
+ struct lttng_ht *ctf_traces_ht)
{
int delret;
struct relay_viewer_stream *vstream;
struct lttng_ht_iter iter;
assert(stream);
- assert(viewer_streams_ht);
delret = close(stream->fd);
if (delret < 0) {
}
}
- vstream = live_find_viewer_stream_by_id(stream->stream_handle,
- viewer_streams_ht);
+ vstream = live_find_viewer_stream_by_id(stream->stream_handle);
if (vstream) {
/*
* Set the last good value into the viewer stream. This is done
rcu_read_lock();
cds_lfht_for_each_entry(relay_streams_ht->ht, &iter.iter, node, node) {
node = lttng_ht_iter_get_node_ulong(&iter);
- if (node) {
- stream = caa_container_of(node,
- struct relay_stream, stream_n);
- if (stream->session == cmd->session) {
- ret = close(stream->fd);
- if (ret < 0) {
- PERROR("close stream fd on delete session");
- }
- ret = lttng_ht_del(relay_streams_ht, &iter);
- assert(!ret);
- call_rcu(&stream->rcu_node,
- deferred_free_stream);
- }
- /* Cleanup index of that stream. */
- relay_index_destroy_by_stream_id(stream->stream_handle,
- indexes_ht);
+ if (!node) {
+ continue;
}
+ stream = caa_container_of(node, struct relay_stream, stream_n);
+ if (stream->session == cmd->session) {
+ destroy_stream(stream, cmd->ctf_traces_ht);
+ }
+ /* Cleanup index of that stream. */
+ relay_index_destroy_by_stream_id(stream->stream_handle, indexes_ht);
}
+
+ /* Make this session not visible anymore. */
iter.iter.node = &cmd->session->session_n.node;
ret = lttng_ht_del(sessions_ht, &iter);
assert(!ret);
- call_rcu(&cmd->session->rcu_node,
- deferred_free_session);
+ call_rcu(&cmd->session->rcu_node, deferred_free_session);
rcu_read_unlock();
}
*/
static
int relay_close_stream(struct lttcomm_relayd_hdr *recv_hdr,
- struct relay_command *cmd, struct lttng_ht *viewer_streams_ht)
+ struct relay_command *cmd)
{
int ret, send_ret;
struct relay_session *session = cmd->session;
stream->close_flag = 1;
if (close_stream_check(stream)) {
- close_stream(stream, viewer_streams_ht, cmd->ctf_traces_ht);
+ destroy_stream(stream, cmd->ctf_traces_ht);
}
end_unlock:
ret = relay_send_version(recv_hdr, cmd, ctx->sessions_ht);
break;
case RELAYD_CLOSE_STREAM:
- ret = relay_close_stream(recv_hdr, cmd, ctx->viewer_streams_ht);
+ ret = relay_close_stream(recv_hdr, cmd);
break;
case RELAYD_DATA_PENDING:
ret = relay_data_pending(recv_hdr, cmd);
*/
static
int relay_process_data(struct relay_command *cmd,
- struct lttng_ht *indexes_ht, struct lttng_ht *viewer_streams_ht)
+ struct lttng_ht *indexes_ht)
{
int ret = 0, rotate_index = 0, index_created = 0;
struct relay_stream *stream;
/* Check if we need to close the FD */
if (close_stream_check(stream)) {
- close_stream(stream, viewer_streams_ht, cmd->ctf_traces_ht);
+ destroy_stream(stream, cmd->ctf_traces_ht);
}
end_rcu_unlock:
continue;
}
- ret = relay_process_data(relay_connection, indexes_ht,
- relay_ctx->viewer_streams_ht);
+ ret = relay_process_data(relay_connection, indexes_ht);
/* connection closed */
if (ret < 0) {
relay_cleanup_poll_connection(&events, pollfd);
}
/* tables of streams indexed by stream ID */
- relay_ctx->viewer_streams_ht = lttng_ht_new(0, LTTNG_HT_TYPE_U64);
- if (!relay_ctx->viewer_streams_ht) {
+ viewer_streams_ht = lttng_ht_new(0, LTTNG_HT_TYPE_U64);
+ if (!viewer_streams_ht) {
goto exit_relay_ctx_viewer_streams;
}
PERROR("pthread_join");
goto error; /* join error, exit without cleanup */
}
- lttng_ht_destroy(relay_ctx->viewer_streams_ht);
+ lttng_ht_destroy(viewer_streams_ht);
exit_relay_ctx_viewer_streams:
lttng_ht_destroy(relay_streams_ht);