Fix: create/destroy a splice_pipe per stream
[lttng-tools.git] / src / common / kernel-consumer / kernel-consumer.c
index e5595a1c3c106973bbbd285997612b98d422bca0..161293d4fd52790842507166ea1e7605d795b07c 100644 (file)
@@ -17,6 +17,7 @@
  */
 
 #define _GNU_SOURCE
+#define _LGPL_SOURCE
 #include <assert.h>
 #include <poll.h>
 #include <pthread.h>
@@ -61,7 +62,7 @@ int lttng_kconsumer_take_snapshot(struct lttng_consumer_stream *stream)
 
        ret = kernctl_snapshot(infd);
        if (ret != 0) {
-               perror("Getting sub-buffer snapshot.");
+               PERROR("Getting sub-buffer snapshot.");
                ret = -errno;
        }
 
@@ -81,7 +82,7 @@ int lttng_kconsumer_get_produced_snapshot(struct lttng_consumer_stream *stream,
 
        ret = kernctl_snapshot_get_produced(infd, pos);
        if (ret != 0) {
-               perror("kernctl_snapshot_get_produced");
+               PERROR("kernctl_snapshot_get_produced");
                ret = -errno;
        }
 
@@ -101,7 +102,7 @@ int lttng_kconsumer_get_consumed_snapshot(struct lttng_consumer_stream *stream,
 
        ret = kernctl_snapshot_get_consumed(infd, pos);
        if (ret != 0) {
-               perror("kernctl_snapshot_get_consumed");
+               PERROR("kernctl_snapshot_get_consumed");
                ret = -errno;
        }
 
@@ -642,6 +643,10 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                switch (channel->output) {
                case CONSUMER_CHANNEL_SPLICE:
                        new_stream->output = LTTNG_EVENT_SPLICE;
+                       ret = utils_create_pipe(new_stream->splice_pipe);
+                       if (ret < 0) {
+                               goto end_nosignal;
+                       }
                        break;
                case CONSUMER_CHANNEL_MMAP:
                        new_stream->output = LTTNG_EVENT_MMAP;
@@ -774,7 +779,7 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                 * Send status code to session daemon.
                 */
                ret = consumer_send_status_msg(sock, ret_code);
-               if (ret < 0) {
+               if (ret < 0 || ret_code != LTTCOMM_CONSUMERD_SUCCESS) {
                        /* Somehow, the session daemon is not responding anymore. */
                        goto end_nosignal;
                }
@@ -1083,14 +1088,14 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
        /* Get the full subbuffer size including padding */
        err = kernctl_get_padded_subbuf_size(infd, &len);
        if (err != 0) {
-               perror("Getting sub-buffer len failed.");
+               PERROR("Getting sub-buffer len failed.");
                err = kernctl_put_subbuf(infd);
                if (err != 0) {
                        if (errno == EFAULT) {
-                               perror("Error in unreserving sub buffer\n");
+                               PERROR("Error in unreserving sub buffer\n");
                        } else if (errno == EIO) {
                                /* Should never happen with newer LTTng versions */
-                               perror("Reader has been pushed by the writer, last sub-buffer corrupted.");
+                               PERROR("Reader has been pushed by the writer, last sub-buffer corrupted.");
                        }
                        ret = -errno;
                        goto end;
@@ -1105,10 +1110,10 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
                        err = kernctl_put_subbuf(infd);
                        if (err != 0) {
                                if (errno == EFAULT) {
-                                       perror("Error in unreserving sub buffer\n");
+                                       PERROR("Error in unreserving sub buffer\n");
                                } else if (errno == EIO) {
                                        /* Should never happen with newer LTTng versions */
-                                       perror("Reader has been pushed by the writer, last sub-buffer corrupted.");
+                                       PERROR("Reader has been pushed by the writer, last sub-buffer corrupted.");
                                }
                                ret = -errno;
                                goto end;
@@ -1150,14 +1155,14 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
                /* Get subbuffer size without padding */
                err = kernctl_get_subbuf_size(infd, &subbuf_size);
                if (err != 0) {
-                       perror("Getting sub-buffer len failed.");
+                       PERROR("Getting sub-buffer len failed.");
                        err = kernctl_put_subbuf(infd);
                        if (err != 0) {
                                if (errno == EFAULT) {
-                                       perror("Error in unreserving sub buffer\n");
+                                       PERROR("Error in unreserving sub buffer\n");
                                } else if (errno == EIO) {
                                        /* Should never happen with newer LTTng versions */
-                                       perror("Reader has been pushed by the writer, last sub-buffer corrupted.");
+                                       PERROR("Reader has been pushed by the writer, last sub-buffer corrupted.");
                                }
                                ret = -errno;
                                goto end;
@@ -1200,10 +1205,10 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
        err = kernctl_put_next_subbuf(infd);
        if (err != 0) {
                if (errno == EFAULT) {
-                       perror("Error in unreserving sub buffer\n");
+                       PERROR("Error in unreserving sub buffer\n");
                } else if (errno == EIO) {
                        /* Should never happen with newer LTTng versions */
-                       perror("Reader has been pushed by the writer, last sub-buffer corrupted.");
+                       PERROR("Reader has been pushed by the writer, last sub-buffer corrupted.");
                }
                ret = -errno;
                goto end;
This page took 0.025866 seconds and 4 git commands to generate.