+
+/*
+ * Ask the consumer if the data is ready to read (NOT pending) 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 pending.
+ */
+int consumer_is_data_pending(unsigned int id,
+ struct consumer_output *consumer)
+{
+ int ret;
+ int32_t ret_code = 0; /* Default is that the data is NOT pending */
+ struct consumer_socket *socket;
+ struct lttng_ht_iter iter;
+ struct lttcomm_consumer_msg msg;
+
+ assert(consumer);
+
+ msg.cmd_type = LTTNG_CONSUMER_DATA_PENDING;
+
+ msg.u.data_pending.session_id = (uint64_t) id;
+
+ DBG3("Consumer data pending 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 pending command");
+ pthread_mutex_unlock(socket->lock);
+ goto error;
+ }
+
+ /*
+ * No need for a recv reply status because the answer to the command is
+ * the reply status message.
+ */
+
+ ret = lttcomm_recv_unix_sock(socket->fd, &ret_code, sizeof(ret_code));
+ if (ret < 0) {
+ PERROR("recv consumer data pending status");
+ pthread_mutex_unlock(socket->lock);
+ goto error;
+ }
+
+ pthread_mutex_unlock(socket->lock);
+
+ if (ret_code == 1) {
+ break;
+ }
+ }
+
+ DBG("Consumer data pending ret %d", ret_code);
+ return ret_code;
+
+error:
+ return -1;
+}