Fix: Synchronization issue for data available command
[lttng-tools.git] / src / common / ust-consumer / ust-consumer.c
index f802c462d4393565d5c3da60be70bd6b8d1cad3e..4d3671a34bbcbe027ae9520f44aca94a51b92af0 100644 (file)
@@ -312,8 +312,19 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
        }
        case LTTNG_CONSUMER_DATA_AVAILABLE:
        {
-               rcu_read_unlock();
-               return -ENOSYS;
+               int32_t ret;
+               uint64_t id = msg.u.data_available.session_id;
+
+               DBG("UST consumer data available command for id %" PRIu64, id);
+
+               ret = consumer_data_available(id);
+
+               /* Send back returned value to session daemon */
+               ret = lttcomm_send_unix_sock(sock, &ret, sizeof(ret));
+               if (ret < 0) {
+                       PERROR("send data available ret code");
+               }
+               break;
        }
        default:
                break;
@@ -512,3 +523,34 @@ int lttng_ustconsumer_on_recv_stream(struct lttng_consumer_stream *stream)
 error:
        return ret;
 }
+
+/*
+ * Check if data is still being extracted from the buffers for a specific
+ * stream. Consumer data lock MUST be acquired before calling this function
+ * and the stream lock.
+ *
+ * Return 0 if the traced data are still getting read else 1 meaning that the
+ * data is available for trace viewer reading.
+ */
+int lttng_ustconsumer_data_available(struct lttng_consumer_stream *stream)
+{
+       int ret;
+
+       assert(stream);
+
+       DBG("UST consumer checking data availability");
+
+       ret = ustctl_get_next_subbuf(stream->chan->handle, stream->buf);
+       if (ret == 0) {
+               /* There is still data so let's put back this subbuffer. */
+               ret = ustctl_put_subbuf(stream->chan->handle, stream->buf);
+               assert(ret == 0);
+               goto end;
+       }
+
+       /* Data is available to be read for this stream. */
+       ret = 1;
+
+end:
+       return ret;
+}
This page took 0.02495 seconds and 4 git commands to generate.