Remove MSG_WAITALL on every recvmsg() socket type
[lttng-tools.git] / src / common / kernel-consumer / kernel-consumer.c
index c762934ff92a55569b9323852589157e3e4ceb81..0b0592adb8a3bbe008141a4cb92196e020b752c8 100644 (file)
@@ -168,6 +168,7 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                                msg.u.stream.gid,
                                msg.u.stream.net_index,
                                msg.u.stream.metadata_flag,
+                               msg.u.stream.session_id,
                                &alloc_ret);
                if (new_stream == NULL) {
                        switch (alloc_ret) {
@@ -279,6 +280,22 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
 
                goto end_nosignal;
        }
+       case LTTNG_CONSUMER_DATA_PENDING:
+       {
+               int32_t ret;
+               uint64_t id = msg.u.data_pending.session_id;
+
+               DBG("Kernel consumer data pending command for id %" PRIu64, id);
+
+               ret = consumer_data_pending(id);
+
+               /* Send back returned value to session daemon */
+               ret = lttcomm_send_unix_sock(sock, &ret, sizeof(ret));
+               if (ret < 0) {
+                       PERROR("send data pending ret code");
+               }
+               break;
+       }
        default:
                goto end_nosignal;
        }
@@ -466,3 +483,32 @@ 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 1 if the traced data are still getting read else 0 meaning that the
+ * data is available for trace viewer reading.
+ */
+int lttng_kconsumer_data_pending(struct lttng_consumer_stream *stream)
+{
+       int ret;
+
+       assert(stream);
+
+       ret = kernctl_get_next_subbuf(stream->wait_fd);
+       if (ret == 0) {
+               /* There is still data so let's put back this subbuffer. */
+               ret = kernctl_put_subbuf(stream->wait_fd);
+               assert(ret == 0);
+               ret = 1;   /* Data is pending */
+               goto end;
+       }
+
+       /* Data is NOT pending and ready to be read. */
+       ret = 0;
+
+end:
+       return ret;
+}
This page took 0.024728 seconds and 4 git commands to generate.