/*
- * 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
#include <common/hashtable/hashtable.h>
#include <lttng/lttng.h>
#include <urcu/ref.h>
+#include <algorithm>
#include "snapshot.h"
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,
};
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;
};
/*
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))];
/*
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);
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);
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,
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,
int consumer_create_trace_chunk(struct consumer_socket *socket,
uint64_t relayd_id, uint64_t session_id,
- struct lttng_trace_chunk *chunk);
+ struct lttng_trace_chunk *chunk,
+ const char *domain_subdir);
int consumer_close_trace_chunk(struct consumer_socket *socket,
uint64_t relayd_id, uint64_t session_id,
struct lttng_trace_chunk *chunk,
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 */