Fix: lttng-sessiond: cpu hotplug: send channel to consumer only once
[lttng-tools.git] / src / bin / lttng-sessiond / kernel-consumer.c
index 83771f2d75c8896d142a705066410c50023acaf4..3649374efb0ae38cf6f1685df734abe7f6d28d88 100644 (file)
  * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#define _GNU_SOURCE
 #define _LGPL_SOURCE
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 #include <sys/stat.h>
 #include <unistd.h>
 
 #include <common/common.h>
 #include <common/defaults.h>
+#include <common/compat/string.h>
 
 #include "consumer.h"
 #include "health-sessiond.h"
@@ -48,9 +47,9 @@ static char *create_channel_path(struct consumer_output *consumer,
                        PERROR("snprintf kernel channel path");
                        goto error;
                }
-               pathname = strndup(tmp_path, sizeof(tmp_path));
+               pathname = lttng_strndup(tmp_path, sizeof(tmp_path));
                if (!pathname) {
-                       PERROR("strndup");
+                       PERROR("lttng_strndup");
                        goto error;
                }
 
@@ -69,9 +68,9 @@ static char *create_channel_path(struct consumer_output *consumer,
                        PERROR("snprintf kernel metadata path");
                        goto error;
                }
-               pathname = strndup(tmp_path, sizeof(tmp_path));
+               pathname = lttng_strndup(tmp_path, sizeof(tmp_path));
                if (!pathname) {
-                       PERROR("strndup");
+                       PERROR("lttng_strndup");
                        goto error;
                }
                DBG3("Kernel network consumer subdir path: %s", pathname);
@@ -314,7 +313,7 @@ int kernel_consumer_send_channel_stream(struct consumer_socket *sock,
                struct ltt_kernel_channel *channel, struct ltt_kernel_session *session,
                unsigned int monitor)
 {
-       int ret;
+       int ret = LTTNG_OK;
        struct ltt_kernel_stream *stream;
 
        /* Safety net */
@@ -332,14 +331,17 @@ int kernel_consumer_send_channel_stream(struct consumer_socket *sock,
        DBG("Sending streams of channel %s to kernel consumer",
                        channel->channel->name);
 
-       ret = kernel_consumer_add_channel(sock, channel, session, monitor);
-       if (ret < 0) {
-               goto error;
+       if (!channel->sent_to_consumer) {
+               ret = kernel_consumer_add_channel(sock, channel, session, monitor);
+               if (ret < 0) {
+                       goto error;
+               }
+               channel->sent_to_consumer = true;
        }
 
        /* Send streams */
        cds_list_for_each_entry(stream, &channel->stream_list.head, list) {
-               if (!stream->fd) {
+               if (!stream->fd || stream->sent_to_consumer) {
                        continue;
                }
 
@@ -349,6 +351,7 @@ int kernel_consumer_send_channel_stream(struct consumer_socket *sock,
                if (ret < 0) {
                        goto error;
                }
+               stream->sent_to_consumer = true;
        }
 
 error:
This page took 0.025264 seconds and 4 git commands to generate.