X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fconsumer.cpp;h=c0f8eb5894e8fae8cb070109d4820ebec62ddff2;hb=0114db0ec2407029052eb61a0189c9b1cd64d520;hp=ba4e2470f30c3b50ec670bc886f89c5d01d69cf2;hpb=ff9fe3137fc1aec6e18ebbf7c218907698206e7d;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/consumer.cpp b/src/bin/lttng-sessiond/consumer.cpp index ba4e2470f..c0f8eb589 100644 --- a/src/bin/lttng-sessiond/consumer.cpp +++ b/src/bin/lttng-sessiond/consumer.cpp @@ -15,17 +15,17 @@ #include #include -#include -#include -#include -#include -#include - -#include "consumer.h" -#include "health-sessiond.h" -#include "ust-app.h" -#include "utils.h" -#include "lttng-sessiond.h" +#include +#include +#include +#include +#include + +#include "consumer.hpp" +#include "health-sessiond.hpp" +#include "ust-app.hpp" +#include "utils.hpp" +#include "lttng-sessiond.hpp" /* * Return allocated full pathname of the session using the consumer trace path @@ -49,7 +49,7 @@ char *setup_channel_trace_path(struct consumer_output *consumer, * Allocate the string ourself to make sure we never exceed * LTTNG_PATH_MAX. */ - pathname = (char *) zmalloc(LTTNG_PATH_MAX); + pathname = calloc(LTTNG_PATH_MAX); if (!pathname) { goto error; } @@ -367,6 +367,8 @@ struct consumer_socket *consumer_find_socket_by_bitness(int bits, int consumer_fd; struct consumer_socket *socket = NULL; + ASSERT_RCU_READ_LOCKED(); + switch (bits) { case 64: consumer_fd = uatomic_read(&the_ust_consumerd64_fd); @@ -401,6 +403,8 @@ struct consumer_socket *consumer_find_socket(int key, struct lttng_ht_node_ulong *node; struct consumer_socket *socket = NULL; + ASSERT_RCU_READ_LOCKED(); + /* Negative keys are lookup failures */ if (key < 0 || consumer == NULL) { return NULL; @@ -410,7 +414,7 @@ struct consumer_socket *consumer_find_socket(int key, &iter); node = lttng_ht_iter_get_node_ulong(&iter); if (node != NULL) { - socket = caa_container_of(node, struct consumer_socket, node); + socket = lttng::utils::container_of(node, &consumer_socket::node); } return socket; @@ -425,7 +429,7 @@ struct consumer_socket *consumer_allocate_socket(int *fd) LTTNG_ASSERT(fd); - socket = (consumer_socket *) zmalloc(sizeof(struct consumer_socket)); + socket = zmalloc(); if (socket == NULL) { PERROR("zmalloc consumer socket"); goto error; @@ -447,6 +451,7 @@ void consumer_add_socket(struct consumer_socket *sock, { LTTNG_ASSERT(sock); LTTNG_ASSERT(consumer); + ASSERT_RCU_READ_LOCKED(); lttng_ht_add_unique_ulong(consumer->socks, &sock->node); } @@ -463,6 +468,7 @@ void consumer_del_socket(struct consumer_socket *sock, LTTNG_ASSERT(sock); LTTNG_ASSERT(consumer); + ASSERT_RCU_READ_LOCKED(); iter.iter.node = &sock->node.node; ret = lttng_ht_del(consumer->socks, &iter); @@ -475,16 +481,18 @@ void consumer_del_socket(struct consumer_socket *sock, static void destroy_socket_rcu(struct rcu_head *head) { struct lttng_ht_node_ulong *node = - caa_container_of(head, struct lttng_ht_node_ulong, head); + lttng::utils::container_of(head, <tng_ht_node_ulong::head); struct consumer_socket *socket = - caa_container_of(node, struct consumer_socket, node); + lttng::utils::container_of(node, &consumer_socket::node); free(socket); } /* - * Destroy and free socket pointer in a call RCU. Read side lock must be - * acquired before calling this function. + * Destroy and free socket pointer in a call RCU. The call must either: + * - have acquired the read side lock before calling this function, or + * - guarantee the validity of the `struct consumer_socket` object for the + * duration of the call. */ void consumer_destroy_socket(struct consumer_socket *sock) { @@ -512,7 +520,7 @@ struct consumer_output *consumer_create_output(enum consumer_dst_type type) { struct consumer_output *output = NULL; - output = (consumer_output *) zmalloc(sizeof(struct consumer_output)); + output = zmalloc(); if (output == NULL) { PERROR("zmalloc consumer_output"); goto error; @@ -558,13 +566,13 @@ void consumer_destroy_output_sockets(struct consumer_output *obj) static void consumer_release_output(struct urcu_ref *ref) { struct consumer_output *obj = - caa_container_of(ref, struct consumer_output, ref); + lttng::utils::container_of(ref, &consumer_output::ref); consumer_destroy_output_sockets(obj); if (obj->socks) { /* Finally destroy HT */ - ht_cleanup_push(obj->socks); + lttng_ht_destroy(obj->socks); } free(obj); @@ -916,7 +924,7 @@ void consumer_init_ask_channel_comm_msg(struct lttcomm_consumer_msg *msg, const char *name, uint64_t relayd_id, uint64_t key, - unsigned char *uuid, + const lttng_uuid& uuid, uint32_t chan_id, uint64_t tracefile_size, uint64_t tracefile_count, @@ -971,7 +979,7 @@ void consumer_init_ask_channel_comm_msg(struct lttcomm_consumer_msg *msg, msg->u.ask_channel.ust_app_uid = ust_app_uid; msg->u.ask_channel.blocking_timeout = blocking_timeout; - memcpy(msg->u.ask_channel.uuid, uuid, sizeof(msg->u.ask_channel.uuid)); + std::copy(uuid.begin(), uuid.end(), msg->u.ask_channel.uuid); if (pathname) { strncpy(msg->u.ask_channel.pathname, pathname, @@ -1001,8 +1009,6 @@ void consumer_init_add_channel_comm_msg(struct lttcomm_consumer_msg *msg, uint64_t channel_key, uint64_t session_id, const char *pathname, - uid_t uid, - gid_t gid, uint64_t relayd_id, const char *name, unsigned int nb_init_streams, @@ -1173,7 +1179,9 @@ int consumer_send_relayd_socket(struct consumer_socket *consumer_sock, msg.u.relayd_sock.net_index = consumer->net_seq_index; msg.u.relayd_sock.type = type; msg.u.relayd_sock.session_id = session_id; - memcpy(&msg.u.relayd_sock.sock, rsock, sizeof(msg.u.relayd_sock.sock)); + msg.u.relayd_sock.major = rsock->major; + msg.u.relayd_sock.minor = rsock->minor; + msg.u.relayd_sock.relayd_socket_protocol = rsock->sock.proto; DBG3("Sending relayd sock info to consumer on %d", *consumer_sock->fd_ptr); ret = consumer_send_msg(consumer_sock, &msg); @@ -1451,6 +1459,7 @@ int consumer_push_metadata(struct consumer_socket *socket, struct lttcomm_consumer_msg msg; LTTNG_ASSERT(socket); + ASSERT_RCU_READ_LOCKED(); DBG2("Consumer push metadata to consumer socket %d", *socket->fd_ptr); @@ -1496,7 +1505,7 @@ end: */ enum lttng_error_code consumer_snapshot_channel(struct consumer_socket *socket, uint64_t key, const struct consumer_output *output, int metadata, - uid_t uid, gid_t gid, const char *channel_path, int wait, + const char *channel_path, uint64_t nb_packets_per_stream) { int ret; @@ -1676,7 +1685,7 @@ end: * chunk each stream is currently writing to (for the rotate_pending operation). */ int consumer_rotate_channel(struct consumer_socket *socket, uint64_t key, - uid_t uid, gid_t gid, struct consumer_output *output, + struct consumer_output *output, bool is_metadata_channel) { int ret; @@ -1722,6 +1731,7 @@ int consumer_open_channel_packets(struct consumer_socket *socket, uint64_t key) int ret; lttcomm_consumer_msg msg = { .cmd_type = LTTNG_CONSUMER_OPEN_CHANNEL_PACKETS, + .u = {}, }; msg.u.open_channel_packets.key = key; @@ -1772,17 +1782,18 @@ error_socket: } int consumer_init(struct consumer_socket *socket, - const lttng_uuid sessiond_uuid) + const lttng_uuid& sessiond_uuid) { int ret; struct lttcomm_consumer_msg msg = { .cmd_type = LTTNG_CONSUMER_INIT, + .u = {}, }; LTTNG_ASSERT(socket); DBG("Sending consumer initialization command"); - lttng_uuid_copy(msg.u.init.sessiond_uuid, sessiond_uuid); + std::copy(sessiond_uuid.begin(), sessiond_uuid.end(), msg.u.init.sessiond_uuid); health_code_update(); ret = consumer_send_msg(socket, &msg); @@ -1821,6 +1832,7 @@ int consumer_create_trace_chunk(struct consumer_socket *socket, enum lttng_trace_chunk_status tc_status; struct lttcomm_consumer_msg msg = { .cmd_type = LTTNG_CONSUMER_CREATE_TRACE_CHUNK, + .u = {}, }; msg.u.create_trace_chunk.session_id = session_id; @@ -1975,6 +1987,7 @@ int consumer_close_trace_chunk(struct consumer_socket *socket, enum lttng_trace_chunk_status chunk_status; lttcomm_consumer_msg msg = { .cmd_type = LTTNG_CONSUMER_CLOSE_TRACE_CHUNK, + .u = {}, }; msg.u.close_trace_chunk.session_id = session_id; @@ -2101,6 +2114,7 @@ int consumer_trace_chunk_exists(struct consumer_socket *socket, enum lttng_trace_chunk_status chunk_status; lttcomm_consumer_msg msg = { .cmd_type = LTTNG_CONSUMER_TRACE_CHUNK_EXISTS, + .u = {}, }; msg.u.trace_chunk_exists.session_id = session_id;