X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fnotification-thread-events.cpp;h=909ccbff2cc1b6f36eba822957bdfec10a11a957;hb=8a880a84dcb8ee64cbc4a5e04cae6775b4f9babd;hp=6f449fc638cef0df78f88c8abcc5d575f6376ad6;hpb=7966af5763c4aaca39df9bbfa9277ff15715c720;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/notification-thread-events.cpp b/src/bin/lttng-sessiond/notification-thread-events.cpp index 6f449fc63..909ccbff2 100644 --- a/src/bin/lttng-sessiond/notification-thread-events.cpp +++ b/src/bin/lttng-sessiond/notification-thread-events.cpp @@ -6,46 +6,46 @@ */ #include "lttng/action/action.h" -#include "lttng/trigger/trigger-internal.h" +#include "lttng/trigger/trigger-internal.hpp" #define _LGPL_SOURCE #include #include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include #include -#include "condition-internal.h" -#include "event-notifier-error-accounting.h" -#include "notification-thread.h" -#include "notification-thread-events.h" -#include "notification-thread-commands.h" -#include "lttng-sessiond.h" -#include "kernel.h" +#include "condition-internal.hpp" +#include "event-notifier-error-accounting.hpp" +#include "notification-thread.hpp" +#include "notification-thread-events.hpp" +#include "notification-thread-commands.hpp" +#include "lttng-sessiond.hpp" +#include "kernel.hpp" #define CLIENT_POLL_MASK_IN (LPOLLIN | LPOLLERR | LPOLLHUP | LPOLLRDHUP) #define CLIENT_POLL_MASK_IN_OUT (CLIENT_POLL_MASK_IN | LPOLLOUT) @@ -569,7 +569,7 @@ struct session_info *session_info_create(const char *name, uid_t uid, gid_t gid, LTTNG_ASSERT(name); - session_info = (struct session_info *) zmalloc(sizeof(*session_info)); + session_info = zmalloc(); if (!session_info) { goto end; } @@ -623,7 +623,7 @@ struct channel_info *channel_info_create(const char *channel_name, struct channel_key *channel_key, uint64_t channel_capacity, struct session_info *session_info) { - struct channel_info *channel_info = (struct channel_info *) zmalloc(sizeof(*channel_info)); + struct channel_info *channel_info = zmalloc(); if (!channel_info) { goto end; @@ -723,7 +723,7 @@ struct notification_client_list *notification_client_list_create( struct cds_lfht_iter iter; struct notification_client_list *client_list; - client_list = (notification_client_list *) zmalloc(sizeof(*client_list)); + client_list = zmalloc(); if (!client_list) { PERROR("Failed to allocate notification client list"); goto end; @@ -755,7 +755,7 @@ struct notification_client_list *notification_client_list_create( continue; } - client_list_element = (notification_client_list_element *) zmalloc(sizeof(*client_list_element)); + client_list_element = zmalloc(); if (!client_list_element) { goto error_put_client_list; } @@ -1031,8 +1031,15 @@ int evaluate_condition_for_client(const struct lttng_trigger *trigger, struct lttng_evaluation *evaluation = NULL; struct notification_client_list client_list = { .lock = PTHREAD_MUTEX_INITIALIZER, + .ref = {}, + .condition = NULL, + .triggers_list = {}, + .clients_list = {}, + .notification_trigger_clients_ht = NULL, + .notification_trigger_clients_ht_node = {}, + .rcu_node = {}, }; - struct notification_client_list_element client_list_element = { 0 }; + struct notification_client_list_element client_list_element = {}; uid_t object_uid = 0; gid_t object_gid = 0; @@ -1116,12 +1123,12 @@ int notification_thread_client_subscribe(struct notification_client *client, } } - condition_list_element = (lttng_condition_list_element *) zmalloc(sizeof(*condition_list_element)); + condition_list_element = zmalloc(); if (!condition_list_element) { ret = -1; goto error; } - client_list_element = (notification_client_list_element *) zmalloc(sizeof(*client_list_element)); + client_list_element = zmalloc(); if (!client_list_element) { ret = -1; goto error; @@ -1279,8 +1286,7 @@ void free_notification_client_rcu(struct rcu_head *node) } static -void notification_client_destroy(struct notification_client *client, - struct notification_thread_state *state) +void notification_client_destroy(struct notification_client *client) { if (!client) { return; @@ -1313,6 +1319,8 @@ struct notification_client *get_client_from_socket(int socket, struct cds_lfht_node *node; struct notification_client *client = NULL; + ASSERT_RCU_READ_LOCKED(); + cds_lfht_lookup(state->client_socket_ht, hash_client_socket(socket), match_client_socket, @@ -1341,6 +1349,8 @@ struct notification_client *get_client_from_id(notification_client_id id, struct cds_lfht_node *node; struct notification_client *client = NULL; + ASSERT_RCU_READ_LOCKED(); + cds_lfht_lookup(state->client_id_ht, hash_client_id(id), match_client_id, @@ -1456,6 +1466,8 @@ struct lttng_session_trigger_list *get_session_trigger_list( struct cds_lfht_node *node; struct cds_lfht_iter iter; + ASSERT_RCU_READ_LOCKED(); + cds_lfht_lookup(state->session_triggers_ht, hash_key_str(session_name, lttng_ht_seed), match_session_trigger_list, @@ -1494,7 +1506,7 @@ struct lttng_session_trigger_list *lttng_session_trigger_list_create( { struct lttng_session_trigger_list *list; - list = (lttng_session_trigger_list *) zmalloc(sizeof(*list)); + list = zmalloc(); if (!list) { goto end; } @@ -1545,7 +1557,7 @@ int lttng_session_trigger_list_add(struct lttng_session_trigger_list *list, { int ret = 0; struct lttng_trigger_list_element *new_element = - (lttng_trigger_list_element *) zmalloc(sizeof(*new_element)); + zmalloc(); if (!new_element) { ret = -1; @@ -1743,7 +1755,7 @@ int handle_notification_thread_command_add_channel( continue; } - new_element = (lttng_trigger_list_element *) zmalloc(sizeof(*new_element)); + new_element = zmalloc(); if (!new_element) { rcu_read_unlock(); goto error; @@ -1757,7 +1769,7 @@ int handle_notification_thread_command_add_channel( DBG("Found %i triggers that apply to newly added channel", trigger_count); - channel_trigger_list = (lttng_channel_trigger_list *) zmalloc(sizeof(*channel_trigger_list)); + channel_trigger_list = zmalloc(); if (!channel_trigger_list) { goto error; } @@ -2020,7 +2032,7 @@ int handle_notification_thread_command_add_tracer_event_source( enum lttng_error_code cmd_result = LTTNG_OK; struct notification_event_tracer_event_source_element *element = NULL; - element = (notification_event_tracer_event_source_element *) zmalloc(sizeof(*element)); + element = zmalloc(); if (!element) { cmd_result = LTTNG_ERR_NOMEM; ret = -1; @@ -2037,7 +2049,7 @@ int handle_notification_thread_command_add_tracer_event_source( lttng_domain_type_str(domain_type)); /* Adding the read side pipe to the event poll. */ - ret = lttng_poll_add(&state->events, tracer_event_source_fd, LPOLLIN | LPOLLERR); + ret = lttng_poll_add(&state->events, tracer_event_source_fd, LPOLLPRI | LPOLLIN | LPOLLERR); if (ret < 0) { ERR("Failed to add tracer event source to poll set: tracer_event_source_fd = %d, domain = '%s'", tracer_event_source_fd, @@ -2059,7 +2071,7 @@ int drain_event_notifier_notification_pipe( struct notification_thread_state *state, int pipe, enum lttng_domain_type domain) { - struct lttng_poll_event events = {0}; + struct lttng_poll_event events = {}; int ret; ret = lttng_poll_create(&events, 1, LTTNG_CLOEXEC); @@ -2227,7 +2239,7 @@ end: } static int handle_notification_thread_command_list_triggers( - struct notification_thread_handle *handle, + struct notification_thread_handle *handle __attribute__((unused)), struct notification_thread_state *state, uid_t client_uid, struct lttng_triggers **triggers, @@ -2418,6 +2430,8 @@ int bind_trigger_to_matching_session(struct lttng_trigger *trigger, const char *session_name; struct lttng_session_trigger_list *trigger_list; + ASSERT_RCU_READ_LOCKED(); + condition = lttng_trigger_get_const_condition(trigger); switch (lttng_condition_get_type(condition)) { case LTTNG_CONDITION_TYPE_SESSION_ROTATION_ONGOING: @@ -2464,6 +2478,8 @@ int bind_trigger_to_matching_channels(struct lttng_trigger *trigger, struct cds_lfht_iter iter; struct channel_info *channel; + ASSERT_RCU_READ_LOCKED(); + cds_lfht_for_each_entry(state->channels_ht, &iter, channel, channels_ht_node) { struct lttng_trigger_list_element *trigger_list_element; @@ -2485,7 +2501,7 @@ int bind_trigger_to_matching_channels(struct lttng_trigger *trigger, struct lttng_channel_trigger_list, channel_triggers_ht_node); - trigger_list_element = (lttng_trigger_list_element *) zmalloc(sizeof(*trigger_list_element)); + trigger_list_element = zmalloc(); if (!trigger_list_element) { ret = -1; goto end; @@ -2606,7 +2622,7 @@ enum lttng_error_code setup_tracer_notifier( struct lttng_condition *condition = lttng_trigger_get_condition(trigger); struct notification_trigger_tokens_ht_element *trigger_tokens_ht_element = NULL; - trigger_tokens_ht_element = (notification_trigger_tokens_ht_element *) zmalloc(sizeof(*trigger_tokens_ht_element)); + trigger_tokens_ht_element = zmalloc(); if (!trigger_tokens_ht_element) { ret = LTTNG_ERR_NOMEM; goto end; @@ -2729,7 +2745,7 @@ int handle_notification_thread_command_register_trigger( goto error; } - trigger_ht_element = (lttng_trigger_ht_element *) zmalloc(sizeof(*trigger_ht_element)); + trigger_ht_element = zmalloc(); if (!trigger_ht_element) { ret = -1; goto error; @@ -3107,28 +3123,43 @@ end: return 0; } +static +int pop_cmd_queue(struct notification_thread_handle *handle, + struct notification_thread_command **cmd) +{ + int ret; + uint64_t counter; + + pthread_mutex_lock(&handle->cmd_queue.lock); + ret = lttng_read(handle->cmd_queue.event_fd, &counter, sizeof(counter)); + if (ret != sizeof(counter)) { + ret = -1; + goto error_unlock; + } + + *cmd = cds_list_first_entry(&handle->cmd_queue.list, + struct notification_thread_command, cmd_list_node); + cds_list_del(&((*cmd)->cmd_list_node)); + ret = 0; + +error_unlock: + pthread_mutex_unlock(&handle->cmd_queue.lock); + return ret; +} + /* Returns 0 on success, 1 on exit requested, negative value on error. */ int handle_notification_thread_command( struct notification_thread_handle *handle, struct notification_thread_state *state) { int ret; - uint64_t counter; struct notification_thread_command *cmd; - /* Read the event pipe to put it back into a quiescent state. */ - ret = lttng_read(lttng_pipe_get_readfd(handle->cmd_queue.event_pipe), &counter, - sizeof(counter)); - if (ret != sizeof(counter)) { + ret = pop_cmd_queue(handle, &cmd); + if (ret) { goto error; } - pthread_mutex_lock(&handle->cmd_queue.lock); - cmd = cds_list_first_entry(&handle->cmd_queue.list, - struct notification_thread_command, cmd_list_node); - cds_list_del(&cmd->cmd_list_node); - pthread_mutex_unlock(&handle->cmd_queue.lock); - DBG("Received `%s` command", notification_command_type_str(cmd->type)); switch (cmd->type) { @@ -3320,7 +3351,7 @@ int handle_notification_thread_client_connect( DBG("Handling new notification channel client connection"); - client = (notification_client *) zmalloc(sizeof(*client)); + client = zmalloc(); if (!client) { /* Fatal error. */ ret = -1; @@ -3386,7 +3417,7 @@ int handle_notification_thread_client_connect( return ret; error: - notification_client_destroy(client, state); + notification_client_destroy(client); return ret; } @@ -3402,6 +3433,8 @@ int notification_thread_client_disconnect( int ret; struct lttng_condition_list_element *condition_list_element, *tmp; + ASSERT_RCU_READ_LOCKED(); + /* Acquire the client lock to disable its communication atomically. */ pthread_mutex_lock(&client->lock); client->communication.active = false; @@ -3426,7 +3459,7 @@ int notification_thread_client_disconnect( * Client no longer accessible to other threads (through the * client lists). */ - notification_client_destroy(client, state); + notification_client_destroy(client); return ret; } @@ -3689,6 +3722,7 @@ int client_send_command_reply(struct notification_client *client, struct lttng_notification_channel_message msg = { .type = (int8_t) LTTNG_NOTIFICATION_CHANNEL_MESSAGE_TYPE_COMMAND_REPLY, .size = sizeof(reply), + .fds = 0, }; char buffer[sizeof(msg) + sizeof(reply)]; enum client_transmission_status transmission_status; @@ -3734,7 +3768,7 @@ error: static int client_handle_message_unknown(struct notification_client *client, - struct notification_thread_state *state) + struct notification_thread_state *state __attribute__((unused))) { int ret; /* @@ -3793,6 +3827,7 @@ int client_handle_message_handshake(struct notification_client *client, const struct lttng_notification_channel_message msg_header = { .type = LTTNG_NOTIFICATION_CHANNEL_MESSAGE_TYPE_HANDSHAKE, .size = sizeof(handshake_reply), + .fds = 0, }; enum lttng_notification_channel_status status = LTTNG_NOTIFICATION_CHANNEL_STATUS_OK; @@ -4174,7 +4209,7 @@ bool evaluate_session_consumed_size_condition( static int evaluate_buffer_condition(const struct lttng_condition *condition, struct lttng_evaluation **evaluation, - const struct notification_thread_state *state, + const struct notification_thread_state *state __attribute__((unused)), const struct channel_state_sample *previous_sample, const struct channel_state_sample *latest_sample, uint64_t previous_session_consumed_total, @@ -4263,6 +4298,8 @@ int client_notification_overflow(struct notification_client *client) int ret = 0; const struct lttng_notification_channel_message msg = { .type = (int8_t) LTTNG_NOTIFICATION_CHANNEL_MESSAGE_TYPE_NOTIFICATION_DROPPED, + .size = 0, + .fds = 0, }; ASSERT_LOCKED(client->lock); @@ -4367,6 +4404,8 @@ int notification_client_list_send_evaluation( }; struct lttng_notification_channel_message msg_header = { .type = (int8_t) LTTNG_NOTIFICATION_CHANNEL_MESSAGE_TYPE_NOTIFICATION, + .size = 0, + .fds = 0, }; const struct lttng_credentials *trigger_creds = lttng_trigger_get_credentials(trigger); @@ -4562,7 +4601,7 @@ struct lttng_event_notifier_notification *recv_one_event_notifier_notification( goto end; } - capture_buffer = (char *) zmalloc(capture_buffer_size); + capture_buffer = calloc(capture_buffer_size); if (!capture_buffer) { ERR("Failed to allocate capture buffer"); goto end; @@ -4865,7 +4904,7 @@ int handle_notification_thread_channel_sample( */ struct channel_state_sample *stored_sample; - stored_sample = (channel_state_sample *) zmalloc(sizeof(*stored_sample)); + stored_sample = zmalloc(); if (!stored_sample) { ret = -1; goto end_unlock;