/* Bail out if consumer is disabled */
if (!consumer->enabled) {
- ret = LTTCOMM_OK;
+ ret = LTTNG_OK;
DBG3("Consumer is disabled");
goto error;
}
int channel_key,
uint64_t max_sb_size,
uint64_t mmap_len,
- const char *name)
+ const char *name,
+ unsigned int nb_init_streams)
{
assert(msg);
msg->u.channel.channel_key = channel_key;
msg->u.channel.max_sb_size = max_sb_size;
msg->u.channel.mmap_len = mmap_len;
+ msg->u.channel.nb_init_streams = nb_init_streams;
}
/*
int net_index,
unsigned int metadata_flag,
const char *name,
- const char *pathname)
+ const char *pathname,
+ unsigned int session_id)
{
assert(msg);
msg->u.stream.gid = gid;
msg->u.stream.net_index = net_index;
msg->u.stream.metadata_flag = metadata_flag;
+ msg->u.stream.session_id = (uint64_t) session_id;
strncpy(msg->u.stream.name, name, sizeof(msg->u.stream.name));
msg->u.stream.name[sizeof(msg->u.stream.name) - 1] = '\0';
strncpy(msg->u.stream.path_name, pathname,
break;
case CONSUMER_DST_LOCAL:
/* Add stream file name to stream path */
- strncat(msg->u.stream.path_name, "/", sizeof(msg->u.stream.path_name));
+ strncat(msg->u.stream.path_name, "/",
+ sizeof(msg->u.stream.path_name) -
+ strlen(msg->u.stream.path_name) - 1);
strncat(msg->u.stream.path_name, msg->u.stream.name,
- sizeof(msg->u.stream.path_name));
+ sizeof(msg->u.stream.path_name) -
+ strlen(msg->u.stream.path_name) - 1);
msg->u.stream.path_name[sizeof(msg->u.stream.path_name) - 1] = '\0';
/* Indicate that the stream is NOT network */
msg->u.stream.net_index = -1;
/* Bail out if consumer is disabled */
if (!consumer->enabled) {
- ret = LTTCOMM_OK;
+ ret = LTTNG_OK;
goto error;
}
error:
return ret;
}
+
+/*
+ * Ask the consumer if the data is ready to bread (available) for the specific
+ * session id.
+ *
+ * This function has a different behavior with the consumer i.e. that it waits
+ * for a reply from the consumer if yes or no the data is available.
+ */
+int consumer_is_data_available(unsigned int id,
+ struct consumer_output *consumer)
+{
+ int ret;
+ int32_t ret_code;
+ struct consumer_socket *socket;
+ struct lttng_ht_iter iter;
+ struct lttcomm_consumer_msg msg;
+
+ assert(consumer);
+
+ msg.cmd_type = LTTNG_CONSUMER_DATA_AVAILABLE;
+
+ msg.u.data_available.session_id = (uint64_t) id;
+
+ DBG3("Consumer data available for id %u", id);
+
+ /* Send command for each consumer */
+ cds_lfht_for_each_entry(consumer->socks->ht, &iter.iter, socket,
+ node.node) {
+ /* Code flow error */
+ assert(socket->fd >= 0);
+
+ pthread_mutex_lock(socket->lock);
+
+ ret = lttcomm_send_unix_sock(socket->fd, &msg, sizeof(msg));
+ if (ret < 0) {
+ PERROR("send consumer data available command");
+ pthread_mutex_unlock(socket->lock);
+ goto error;
+ }
+
+ /*
+ * Waiting for the reply code where 0 the data is not available and 1
+ * it is for trace reading.
+ */
+ ret = lttcomm_recv_unix_sock(socket->fd, &ret_code, sizeof(ret_code));
+ if (ret < 0) {
+ PERROR("recv consumer data available status");
+ pthread_mutex_unlock(socket->lock);
+ goto error;
+ }
+
+ pthread_mutex_unlock(socket->lock);
+
+ if (ret_code == 0) {
+ break;
+ }
+ }
+
+ DBG("Consumer data available ret %d", ret_code);
+ return ret_code;
+
+error:
+ return -1;
+}