Create kernel-consumer.c/.h and consumer.h
authorDavid Goulet <dgoulet@efficios.com>
Thu, 7 Jun 2012 17:16:09 +0000 (13:16 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Thu, 7 Jun 2012 17:16:09 +0000 (13:16 -0400)
Contains function call to send data to the kernel consumer (for now
session and channel streams).

Nothing new, code has just been moved to simplify main.c and partition
portion of code for clearer and easier understanding.

Signed-off-by: David Goulet <dgoulet@efficios.com>
src/bin/lttng-sessiond/Makefile.am
src/bin/lttng-sessiond/consumer.h [new file with mode: 0644]
src/bin/lttng-sessiond/kernel-consumer.c [new file with mode: 0644]
src/bin/lttng-sessiond/kernel-consumer.h [new file with mode: 0644]
src/bin/lttng-sessiond/main.c

index e450e4515e4adbf2d23805750aaf300676ad6fae..0bdcdc94d8389caaecd37263a3719fff48e25cbf 100644 (file)
@@ -16,7 +16,8 @@ lttng_sessiond_SOURCES = utils.c utils.h \
                        session.c session.h \
                        modprobe.c modprobe.h kern-modules.h \
                        lttng-ust-ctl.h lttng-ust-abi.h \
-                       fd-limit.c fd-limit.h
+                       fd-limit.c fd-limit.h \
+                       kernel-consumer.c kernel-consumer.h
 
 if HAVE_LIBLTTNG_UST_CTL
 lttng_sessiond_SOURCES += trace-ust.c ust-app.c ust-consumer.c ust-consumer.h
diff --git a/src/bin/lttng-sessiond/consumer.h b/src/bin/lttng-sessiond/consumer.h
new file mode 100644 (file)
index 0000000..21d762a
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2012 - David Goulet <dgoulet@efficios.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License, version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef _CONSUMER_H
+#define _CONSUMER_H
+
+#include <semaphore.h>
+
+#include <common/consumer.h>
+
+struct consumer_data {
+       enum lttng_consumer_type type;
+
+       pthread_t thread;       /* Worker thread interacting with the consumer */
+       sem_t sem;
+
+       /* Mutex to control consumerd pid assignation */
+       pthread_mutex_t pid_mutex;
+       pid_t pid;
+
+       int err_sock;
+       int cmd_sock;
+
+       /* consumer error and command Unix socket path */
+       char err_unix_sock_path[PATH_MAX];
+       char cmd_unix_sock_path[PATH_MAX];
+};
+
+#endif /* _CONSUMER_H */
diff --git a/src/bin/lttng-sessiond/kernel-consumer.c b/src/bin/lttng-sessiond/kernel-consumer.c
new file mode 100644 (file)
index 0000000..f589c2a
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2012 - David Goulet <dgoulet@efficios.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License, version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#define _GNU_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/sessiond-comm/sessiond-comm.h>
+
+#include "kernel-consumer.h"
+
+/*
+ * Send all stream fds of kernel channel to the consumer.
+ */
+int kernel_consumer_send_channel_stream(struct consumer_data *consumer_data,
+               int sock, struct ltt_kernel_channel *channel, uid_t uid, gid_t gid)
+{
+       int ret, count = 0;
+       struct ltt_kernel_stream *stream;
+       struct lttcomm_consumer_msg lkm;
+
+       DBG("Sending streams of channel %s to kernel consumer",
+                       channel->channel->name);
+
+       /* Send channel */
+       lkm.cmd_type = LTTNG_CONSUMER_ADD_CHANNEL;
+       lkm.u.channel.channel_key = channel->fd;
+       lkm.u.channel.max_sb_size = channel->channel->attr.subbuf_size;
+       lkm.u.channel.mmap_len = 0;     /* for kernel */
+       DBG("Sending channel %d to consumer", lkm.u.channel.channel_key);
+       ret = lttcomm_send_unix_sock(sock, &lkm, sizeof(lkm));
+       if (ret < 0) {
+               PERROR("send consumer channel");
+               goto error;
+       }
+
+       /* Send streams */
+       cds_list_for_each_entry(stream, &channel->stream_list.head, list) {
+               if (!stream->fd) {
+                       continue;
+               }
+               /* Reset consumer message structure */
+               memset(&lkm, 0, sizeof(lkm));
+               lkm.cmd_type = LTTNG_CONSUMER_ADD_STREAM;
+               lkm.u.stream.channel_key = channel->fd;
+               lkm.u.stream.stream_key = stream->fd;
+               lkm.u.stream.state = stream->state;
+               lkm.u.stream.output = channel->channel->attr.output;
+               lkm.u.stream.mmap_len = 0;      /* for kernel */
+               lkm.u.stream.uid = uid;
+               lkm.u.stream.gid = gid;
+               strncpy(lkm.u.stream.path_name, stream->pathname, PATH_MAX - 1);
+               lkm.u.stream.path_name[PATH_MAX - 1] = '\0';
+               count++;
+
+               DBG("Sending stream %d to consumer", lkm.u.stream.stream_key);
+               ret = lttcomm_send_unix_sock(sock, &lkm, sizeof(lkm));
+               if (ret < 0) {
+                       PERROR("send consumer stream");
+                       goto error;
+               }
+               ret = lttcomm_send_fds_unix_sock(sock, &stream->fd, 1);
+               if (ret < 0) {
+                       PERROR("send consumer stream ancillary data");
+                       goto error;
+               }
+       }
+
+       DBG("consumer channel streams sent");
+
+       return 0;
+
+error:
+       return ret;
+}
+
+/*
+ * Send all stream fds of the kernel session to the consumer.
+ */
+int kernel_consumer_send_session(struct consumer_data *consumer_data,
+               struct ltt_kernel_session *session)
+{
+       int ret;
+       struct ltt_kernel_channel *chan;
+       struct lttcomm_consumer_msg lkm;
+       int sock = session->consumer_fd;
+
+       DBG("Sending metadata stream fd");
+
+       /* Extra protection. It's NOT supposed to be set to -1 at this point */
+       if (session->consumer_fd < 0) {
+               session->consumer_fd = consumer_data->cmd_sock;
+       }
+
+       if (session->metadata_stream_fd >= 0) {
+               /* Send metadata channel fd */
+               lkm.cmd_type = LTTNG_CONSUMER_ADD_CHANNEL;
+               lkm.u.channel.channel_key = session->metadata->fd;
+               lkm.u.channel.max_sb_size = session->metadata->conf->attr.subbuf_size;
+               lkm.u.channel.mmap_len = 0;     /* for kernel */
+               DBG("Sending metadata channel %d to consumer", lkm.u.channel.channel_key);
+               ret = lttcomm_send_unix_sock(sock, &lkm, sizeof(lkm));
+               if (ret < 0) {
+                       PERROR("send consumer channel");
+                       goto error;
+               }
+
+               /* Send metadata stream fd */
+               lkm.cmd_type = LTTNG_CONSUMER_ADD_STREAM;
+               lkm.u.stream.channel_key = session->metadata->fd;
+               lkm.u.stream.stream_key = session->metadata_stream_fd;
+               lkm.u.stream.state = LTTNG_CONSUMER_ACTIVE_STREAM;
+               lkm.u.stream.output = DEFAULT_KERNEL_CHANNEL_OUTPUT;
+               lkm.u.stream.mmap_len = 0;      /* for kernel */
+               lkm.u.stream.uid = session->uid;
+               lkm.u.stream.gid = session->gid;
+               strncpy(lkm.u.stream.path_name, session->metadata->pathname,
+                               PATH_MAX - 1);
+               lkm.u.stream.path_name[PATH_MAX - 1] = '\0';
+
+               DBG("Sending metadata stream %d to consumer", lkm.u.stream.stream_key);
+               ret = lttcomm_send_unix_sock(sock, &lkm, sizeof(lkm));
+               if (ret < 0) {
+                       PERROR("send consumer stream");
+                       goto error;
+               }
+               ret = lttcomm_send_fds_unix_sock(sock, &session->metadata_stream_fd, 1);
+               if (ret < 0) {
+                       PERROR("send consumer stream");
+                       goto error;
+               }
+       }
+
+       cds_list_for_each_entry(chan, &session->channel_list.head, list) {
+               ret = kernel_consumer_send_channel_stream(consumer_data, sock, chan,
+                               session->uid, session->gid);
+               if (ret < 0) {
+                       goto error;
+               }
+       }
+
+       DBG("consumer fds (metadata and channel streams) sent");
+
+       return 0;
+
+error:
+       return ret;
+}
+
diff --git a/src/bin/lttng-sessiond/kernel-consumer.h b/src/bin/lttng-sessiond/kernel-consumer.h
new file mode 100644 (file)
index 0000000..b7b1631
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2012 - David Goulet <dgoulet@efficios.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License, version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef _KERNEL_CONSUMER_H
+#define _KERNEL_CONSUMER_H
+
+#include <sys/types.h>
+
+#include "consumer.h"
+#include "trace-kernel.h"
+
+int kernel_consumer_send_channel_stream(struct consumer_data *consumer_data,
+               int sock, struct ltt_kernel_channel *channel, uid_t uid, gid_t gid);
+int kernel_consumer_send_session(struct consumer_data *consumer_data,
+               struct ltt_kernel_session *session);
+
+#endif /* _KERNEL_CONSUMER_H */
index 5cfd57971f7423fe21f69c1d58b2cfafca99a05b..a9d538c7cd4b5e201bfafc29981e49409cf5081c 100644 (file)
@@ -50,6 +50,7 @@
 #include "context.h"
 #include "event.h"
 #include "kernel.h"
+#include "kernel-consumer.h"
 #include "modprobe.h"
 #include "shm.h"
 #include "ust-ctl.h"
 
 #define CONSUMERD_FILE "lttng-consumerd"
 
-struct consumer_data {
-       enum lttng_consumer_type type;
-
-       pthread_t thread;       /* Worker thread interacting with the consumer */
-       sem_t sem;
-
-       /* Mutex to control consumerd pid assignation */
-       pthread_mutex_t pid_mutex;
-       pid_t pid;
-
-       int err_sock;
-       int cmd_sock;
-
-       /* consumer error and command Unix socket path */
-       char err_unix_sock_path[PATH_MAX];
-       char cmd_unix_sock_path[PATH_MAX];
-};
-
 /* Const values */
 const char default_home_dir[] = DEFAULT_HOME_DIR;
 const char default_tracing_group[] = DEFAULT_TRACING_GROUP;
@@ -543,139 +526,6 @@ static void clean_command_ctx(struct command_ctx **cmd_ctx)
        }
 }
 
-/*
- * Send all stream fds of kernel channel to the consumer.
- */
-static int send_kconsumer_channel_streams(struct consumer_data *consumer_data,
-               int sock, struct ltt_kernel_channel *channel,
-               uid_t uid, gid_t gid)
-{
-       int ret;
-       struct ltt_kernel_stream *stream;
-       struct lttcomm_consumer_msg lkm;
-
-       DBG("Sending streams of channel %s to kernel consumer",
-                       channel->channel->name);
-
-       /* Send channel */
-       lkm.cmd_type = LTTNG_CONSUMER_ADD_CHANNEL;
-       lkm.u.channel.channel_key = channel->fd;
-       lkm.u.channel.max_sb_size = channel->channel->attr.subbuf_size;
-       lkm.u.channel.mmap_len = 0;     /* for kernel */
-       DBG("Sending channel %d to consumer", lkm.u.channel.channel_key);
-       ret = lttcomm_send_unix_sock(sock, &lkm, sizeof(lkm));
-       if (ret < 0) {
-               PERROR("send consumer channel");
-               goto error;
-       }
-
-       /* Send streams */
-       cds_list_for_each_entry(stream, &channel->stream_list.head, list) {
-               if (!stream->fd) {
-                       continue;
-               }
-               lkm.cmd_type = LTTNG_CONSUMER_ADD_STREAM;
-               lkm.u.stream.channel_key = channel->fd;
-               lkm.u.stream.stream_key = stream->fd;
-               lkm.u.stream.state = stream->state;
-               lkm.u.stream.output = channel->channel->attr.output;
-               lkm.u.stream.mmap_len = 0;      /* for kernel */
-               lkm.u.stream.uid = uid;
-               lkm.u.stream.gid = gid;
-               strncpy(lkm.u.stream.path_name, stream->pathname, PATH_MAX - 1);
-               lkm.u.stream.path_name[PATH_MAX - 1] = '\0';
-               DBG("Sending stream %d to consumer", lkm.u.stream.stream_key);
-               ret = lttcomm_send_unix_sock(sock, &lkm, sizeof(lkm));
-               if (ret < 0) {
-                       PERROR("send consumer stream");
-                       goto error;
-               }
-               ret = lttcomm_send_fds_unix_sock(sock, &stream->fd, 1);
-               if (ret < 0) {
-                       PERROR("send consumer stream ancillary data");
-                       goto error;
-               }
-       }
-
-       DBG("consumer channel streams sent");
-
-       return 0;
-
-error:
-       return ret;
-}
-
-/*
- * Send all stream fds of the kernel session to the consumer.
- */
-static int send_kconsumer_session_streams(struct consumer_data *consumer_data,
-               struct ltt_kernel_session *session)
-{
-       int ret;
-       struct ltt_kernel_channel *chan;
-       struct lttcomm_consumer_msg lkm;
-       int sock = session->consumer_fd;
-
-       DBG("Sending metadata stream fd");
-
-       /* Extra protection. It's NOT supposed to be set to -1 at this point */
-       if (session->consumer_fd < 0) {
-               session->consumer_fd = consumer_data->cmd_sock;
-       }
-
-       if (session->metadata_stream_fd >= 0) {
-               /* Send metadata channel fd */
-               lkm.cmd_type = LTTNG_CONSUMER_ADD_CHANNEL;
-               lkm.u.channel.channel_key = session->metadata->fd;
-               lkm.u.channel.max_sb_size = session->metadata->conf->attr.subbuf_size;
-               lkm.u.channel.mmap_len = 0;     /* for kernel */
-               DBG("Sending metadata channel %d to consumer", lkm.u.channel.channel_key);
-               ret = lttcomm_send_unix_sock(sock, &lkm, sizeof(lkm));
-               if (ret < 0) {
-                       PERROR("send consumer channel");
-                       goto error;
-               }
-
-               /* Send metadata stream fd */
-               lkm.cmd_type = LTTNG_CONSUMER_ADD_STREAM;
-               lkm.u.stream.channel_key = session->metadata->fd;
-               lkm.u.stream.stream_key = session->metadata_stream_fd;
-               lkm.u.stream.state = LTTNG_CONSUMER_ACTIVE_STREAM;
-               lkm.u.stream.output = DEFAULT_KERNEL_CHANNEL_OUTPUT;
-               lkm.u.stream.mmap_len = 0;      /* for kernel */
-               lkm.u.stream.uid = session->uid;
-               lkm.u.stream.gid = session->gid;
-               strncpy(lkm.u.stream.path_name, session->metadata->pathname, PATH_MAX - 1);
-               lkm.u.stream.path_name[PATH_MAX - 1] = '\0';
-               DBG("Sending metadata stream %d to consumer", lkm.u.stream.stream_key);
-               ret = lttcomm_send_unix_sock(sock, &lkm, sizeof(lkm));
-               if (ret < 0) {
-                       PERROR("send consumer stream");
-                       goto error;
-               }
-               ret = lttcomm_send_fds_unix_sock(sock, &session->metadata_stream_fd, 1);
-               if (ret < 0) {
-                       PERROR("send consumer stream");
-                       goto error;
-               }
-       }
-
-       cds_list_for_each_entry(chan, &session->channel_list.head, list) {
-               ret = send_kconsumer_channel_streams(consumer_data, sock, chan,
-                               session->uid, session->gid);
-               if (ret < 0) {
-                       goto error;
-               }
-       }
-
-       DBG("consumer fds (metadata and channel streams) sent");
-
-       return 0;
-
-error:
-       return ret;
-}
-
 /*
  * Notify UST applications using the shm mmap futex.
  */
@@ -817,7 +667,7 @@ static int update_kernel_stream(struct consumer_data *consumer_data, int fd)
                                 * stream fds.
                                 */
                                if (session->kernel_session->consumer_fds_sent == 1) {
-                                       ret = send_kconsumer_channel_streams(consumer_data,
+                                       ret = kernel_consumer_send_channel_stream(consumer_data,
                                                        session->kernel_session->consumer_fd, channel,
                                                        session->uid, session->gid);
                                        if (ret < 0) {
@@ -1931,7 +1781,7 @@ static int init_kernel_tracing(struct ltt_kernel_session *session)
                        session->consumer_fd = kconsumer_data.cmd_sock;
                }
 
-               ret = send_kconsumer_session_streams(&kconsumer_data, session);
+               ret = kernel_consumer_send_session(&kconsumer_data, session);
                if (ret < 0) {
                        ret = LTTCOMM_KERN_CONSUMER_FAIL;
                        goto error;
This page took 0.031996 seconds and 4 git commands to generate.