bin: compile lttng-sessiond as C++
[lttng-tools.git] / src / bin / lttng-sessiond / consumer.h
index a2dc03e7606c4c5a9d8dd0f0b9e82d29fa866ae1..ffba198a829117ab8ace50687c0822be31f40eb0 100644 (file)
@@ -1,18 +1,8 @@
 /*
- * Copyright (C) 2012 David Goulet <dgoulet@efficios.com>
+ * 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.
+ * SPDX-License-Identifier: GPL-2.0-only
  *
- * 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
@@ -22,6 +12,7 @@
 #include <common/hashtable/hashtable.h>
 #include <lttng/lttng.h>
 #include <urcu/ref.h>
+#include <algorithm>
 
 #include "snapshot.h"
 
@@ -29,6 +20,19 @@ struct snapshot;
 struct snapshot_output;
 struct ltt_session;
 
+/*
+ * Needed until we use C++14, where std::max is constexpr.
+ *
+ * Use a static_assert so we remember to remove it when we upgrade to a newer
+ * C++.
+ */
+static_assert(__cplusplus == 201103L, "");
+template <typename T>
+constexpr T max_constexpr(T l, T r)
+{
+       return l > r ? l : r;
+}
+
 enum consumer_dst_type {
        CONSUMER_DST_LOCAL,
        CONSUMER_DST_NET,
@@ -71,39 +75,43 @@ struct consumer_socket {
 };
 
 struct consumer_data {
+       consumer_data (lttng_consumer_type type_)
+               : type(type_)
+       {}
+
        enum lttng_consumer_type type;
 
        /* Mutex to control consumerd pid assignation */
-       pthread_mutex_t pid_mutex;
-       pid_t pid;
+       pthread_mutex_t pid_mutex = PTHREAD_MUTEX_INITIALIZER;
+       pid_t pid = 0;
 
-       int err_sock;
+       int err_sock = -1;
        /* These two sockets uses the cmd_unix_sock_path. */
-       int cmd_sock;
+       int cmd_sock = -1;
        /*
         * Write-end of the channel monitoring pipe to be passed to the
         * consumer.
         */
-       int channel_monitor_pipe;
+       int channel_monitor_pipe = -1;
        /*
         * The metadata socket object is handled differently and only created
         * locally in this object thus it's the only reference available in the
         * session daemon. For that reason, a variable for the fd is required and
         * the metadata socket fd points to it.
         */
-       int metadata_fd;
-       struct consumer_socket metadata_sock;
+       int metadata_fd = 0;
+       struct consumer_socket metadata_sock {};
 
        /* consumer error and command Unix socket path */
-       const char *err_unix_sock_path;
-       const char *cmd_unix_sock_path;
+       const char *err_unix_sock_path = nullptr;
+       const char *cmd_unix_sock_path = nullptr;
 
        /*
         * This lock has two purposes. It protects any change to the consumer
         * socket and make sure only one thread uses this object for read/write
         * operations.
         */
-       pthread_mutex_t lock;
+       pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
 };
 
 /*
@@ -152,11 +160,15 @@ struct consumer_output {
        uint32_t relay_major_version;
        uint32_t relay_minor_version;
 
+       /* True if relayd supports the clear feature. */
+       bool relay_allows_clear;
+
        /*
         * Subdirectory path name used for both local and network
         * consumer ("kernel", "ust", or empty).
         */
-       char domain_subdir[max(sizeof(DEFAULT_KERNEL_TRACE_DIR),
+       char domain_subdir[
+               max_constexpr(sizeof(DEFAULT_KERNEL_TRACE_DIR),
                        sizeof(DEFAULT_UST_TRACE_DIR))];
 
        /*
@@ -194,7 +206,7 @@ void consumer_destroy_socket(struct consumer_socket *sock);
 int consumer_copy_sockets(struct consumer_output *dst,
                struct consumer_output *src);
 void consumer_destroy_output_sockets(struct consumer_output *obj);
-int consumer_socket_send(struct consumer_socket *socket, void *msg,
+int consumer_socket_send(struct consumer_socket *socket, const void *msg,
                size_t len);
 int consumer_socket_recv(struct consumer_socket *socket, void *msg,
                size_t len);
@@ -209,7 +221,7 @@ int consumer_set_network_uri(const struct ltt_session *session,
 int consumer_send_fds(struct consumer_socket *sock, const int *fds,
                size_t nb_fd);
 int consumer_send_msg(struct consumer_socket *sock,
-               struct lttcomm_consumer_msg *msg);
+               const struct lttcomm_consumer_msg *msg);
 int consumer_send_stream(struct consumer_socket *sock,
                struct consumer_output *dst, struct lttcomm_consumer_msg *msg,
                const int *fds, size_t nb_fd);
@@ -240,6 +252,7 @@ void consumer_init_ask_channel_comm_msg(struct lttcomm_consumer_msg *msg,
                unsigned int switch_timer_interval,
                unsigned int read_timer_interval,
                unsigned int live_timer_interval,
+               bool is_in_live_session,
                unsigned int monitor_timer_interval,
                int output,
                int type,
@@ -282,6 +295,7 @@ void consumer_init_add_channel_comm_msg(struct lttcomm_consumer_msg *msg,
                uint64_t tracefile_count,
                unsigned int monitor,
                unsigned int live_timer_interval,
+               bool is_in_live_session,
                unsigned int monitor_timer_interval,
                struct lttng_trace_chunk *trace_chunk);
 int consumer_is_data_pending(uint64_t session_id,
@@ -325,8 +339,12 @@ int consumer_trace_chunk_exists(struct consumer_socket *socket,
                uint64_t relayd_id, uint64_t session_id,
                struct lttng_trace_chunk *chunk,
                enum consumer_trace_chunk_exists_status *result);
+int consumer_open_channel_packets(struct consumer_socket *socket, uint64_t key);
 
 char *setup_channel_trace_path(struct consumer_output *consumer,
                const char *session_path, size_t *consumer_path_offset);
 
+/* Clear command */
+int consumer_clear_channel(struct consumer_socket *socket, uint64_t key);
+
 #endif /* _CONSUMER_H */
This page took 0.026162 seconds and 4 git commands to generate.