case LTTNG_CONSUMER_ADD_CHANNEL:
{
struct lttng_consumer_channel *new_channel;
+ int ret_recv;
/* First send a status message before receiving the fds. */
ret = consumer_send_status_msg(sock, ret_code);
/* Somehow, the session daemon is not responding anymore. */
goto end_nosignal;
}
-
DBG("consumer_add_channel %" PRIu64, msg.u.channel.channel_key);
new_channel = consumer_allocate_channel(msg.u.channel.channel_key,
msg.u.channel.session_id, msg.u.channel.pathname,
};
if (ctx->on_recv_channel != NULL) {
- ret = ctx->on_recv_channel(new_channel);
- if (ret == 0) {
- consumer_add_channel(new_channel, ctx);
- } else if (ret < 0) {
+ ret_recv = ctx->on_recv_channel(new_channel);
+ if (ret_recv == 0) {
+ ret = consumer_add_channel(new_channel, ctx);
+ } else if (ret_recv < 0) {
goto end_nosignal;
}
} else {
- consumer_add_channel(new_channel, ctx);
+ ret = consumer_add_channel(new_channel, ctx);
+ }
+
+ /* If we received an error in add_channel, we need to report it. */
+ if (ret != 0) {
+ consumer_send_status_msg(sock, ret);
+ goto end_nosignal;
}
+
goto end_nosignal;
}
case LTTNG_CONSUMER_ADD_STREAM:
new_stream->chan = channel;
new_stream->wait_fd = fd;
+ /*
+ * We've just assigned the channel to the stream so increment the
+ * refcount right now.
+ */
+ uatomic_inc(&new_stream->chan->refcount);
+
/*
* The buffer flush is done on the session daemon side for the kernel
* so no need for the stream "hangup_flush_done" variable to be