X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fregister.cpp;h=3740b380acddf6039ffa2cc13bf49da4d0e7ac16;hp=34efeac40f57729fd0811806e56cb7665847fefc;hb=HEAD;hpb=de5abcb02431896a1827dff5d3376e1f2e124cd7 diff --git a/src/bin/lttng-sessiond/register.cpp b/src/bin/lttng-sessiond/register.cpp index 34efeac40..0191adc94 100644 --- a/src/bin/lttng-sessiond/register.cpp +++ b/src/bin/lttng-sessiond/register.cpp @@ -7,22 +7,24 @@ * */ -#include -#include -#include +#include "fd-limit.hpp" +#include "health-sessiond.hpp" +#include "lttng-sessiond.hpp" +#include "register.hpp" +#include "testpoint.hpp" +#include "thread.hpp" +#include "utils.hpp" + #include #include #include #include -#include -#include "register.hpp" -#include "lttng-sessiond.hpp" -#include "testpoint.hpp" -#include "health-sessiond.hpp" -#include "fd-limit.hpp" -#include "utils.hpp" -#include "thread.hpp" +#include +#include +#include +#include +#include namespace { struct thread_state { @@ -37,17 +39,15 @@ struct thread_state { /* * Creates the application socket. */ -static int create_application_socket(void) +static int create_application_socket() { int ret = 0; int apps_sock; /* Create the application unix socket */ - apps_sock = lttcomm_create_unix_sock( - the_config.apps_unix_sock_path.value); + apps_sock = lttcomm_create_unix_sock(the_config.apps_unix_sock_path.value); if (apps_sock < 0) { - ERR("Create unix sock failed: %s", - the_config.apps_unix_sock_path.value); + ERR("Create unix sock failed: %s", the_config.apps_unix_sock_path.value); ret = -1; goto end; } @@ -56,17 +56,16 @@ static int create_application_socket(void) ret = utils_set_fd_cloexec(apps_sock); if (ret < 0) { ERR("Unable to set CLOEXEC flag to the app Unix socket (fd: %d). " - "Continuing but note that the consumer daemon will have a " - "reference to this socket on exec()", apps_sock); + "Continuing but note that the consumer daemon will have a " + "reference to this socket on exec()", + apps_sock); } /* File permission MUST be 666 */ ret = chmod(the_config.apps_unix_sock_path.value, - S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | - S_IWOTH); + S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (ret < 0) { - PERROR("Set file permissions failed on %s", - the_config.apps_unix_sock_path.value); + PERROR("Set file permissions failed on %s", the_config.apps_unix_sock_path.value); goto error_close_socket; } @@ -93,9 +92,8 @@ static int notify_ust_apps(int active, bool is_root) DBG("Notifying applications of session daemon state: %d", active); /* See shm.c for this call implying mmap, shm and futex calls */ - wait_shm_mmap = shm_ust_get_mmap( - the_config.wait_shm_path.value, is_root); - if (wait_shm_mmap == NULL) { + wait_shm_mmap = shm_ust_get_mmap(the_config.wait_shm_path.value, is_root); + if (wait_shm_mmap == nullptr) { goto error; } @@ -153,19 +151,18 @@ static void thread_init_cleanup(void *data) */ static void *thread_application_registration(void *data) { - int sock = -1, i, ret, pollfd, err = -1; - uint32_t revents, nb_fd; + int sock = -1, i, ret, err = -1; + uint32_t nb_fd; struct lttng_poll_event events; /* * Gets allocated in this thread, enqueued to a global queue, dequeued * and freed in the manage apps thread. */ - struct ust_command *ust_cmd = NULL; + struct ust_command *ust_cmd = nullptr; const bool is_root = (getuid() == 0); struct thread_state *thread_state = (struct thread_state *) data; const int application_socket = thread_state->application_socket; - const int quit_pipe_read_fd = lttng_pipe_get_readfd( - thread_state->quit_pipe); + const auto thread_quit_pipe_fd = lttng_pipe_get_readfd(thread_state->quit_pipe); DBG("[thread] Manage application registration started"); @@ -193,7 +190,7 @@ static void *thread_application_registration(void *data) } /* Add the application registration socket */ - ret = lttng_poll_add(&events, quit_pipe_read_fd, LPOLLIN | LPOLLRDHUP); + ret = lttng_poll_add(&events, thread_quit_pipe_fd, LPOLLIN | LPOLLRDHUP); if (ret < 0) { goto error_poll_add; } @@ -205,7 +202,7 @@ static void *thread_application_registration(void *data) goto error_poll_add; } - while (1) { + while (true) { DBG("Accepting application registration"); /* Inifinite blocking call, waiting for transmission */ @@ -229,116 +226,119 @@ static void *thread_application_registration(void *data) health_code_update(); /* Fetch once the poll data */ - revents = LTTNG_POLL_GETEV(&events, i); - pollfd = LTTNG_POLL_GETFD(&events, i); + const auto revents = LTTNG_POLL_GETEV(&events, i); + const auto pollfd = LTTNG_POLL_GETFD(&events, i); - /* Thread quit pipe has been closed. Killing thread. */ - if (pollfd == quit_pipe_read_fd) { + /* Activity on thread quit pipe, closing. */ + if (pollfd == thread_quit_pipe_fd) { err = 0; goto exit; - } else { - /* Event on the registration socket */ - if (revents & LPOLLIN) { - sock = lttcomm_accept_unix_sock(application_socket); - if (sock < 0) { - goto error; - } + } - /* - * Set socket timeout for both receiving and ending. - * app_socket_timeout is in seconds, whereas - * lttcomm_setsockopt_rcv_timeout and - * lttcomm_setsockopt_snd_timeout expect msec as - * parameter. - */ - if (the_config.app_socket_timeout >= 0) { - (void) lttcomm_setsockopt_rcv_timeout(sock, - the_config.app_socket_timeout * 1000); - (void) lttcomm_setsockopt_snd_timeout(sock, - the_config.app_socket_timeout * 1000); - } + /* Event on the registration socket. */ + if (revents & LPOLLIN) { + sock = lttcomm_accept_unix_sock(application_socket); + if (sock < 0) { + goto error; + } - /* - * Set the CLOEXEC flag. Return code is useless because - * either way, the show must go on. - */ - (void) utils_set_fd_cloexec(sock); - - /* Create UST registration command for enqueuing */ - ust_cmd = zmalloc(); - if (ust_cmd == NULL) { - PERROR("ust command zmalloc"); - ret = close(sock); - if (ret) { - PERROR("close"); - } - sock = -1; - goto error; - } + /* + * Set socket timeout for both receiving and ending. + * app_socket_timeout is in seconds, whereas + * lttcomm_setsockopt_rcv_timeout and + * lttcomm_setsockopt_snd_timeout expect msec as + * parameter. + */ + if (the_config.app_socket_timeout >= 0) { + (void) lttcomm_setsockopt_rcv_timeout( + sock, the_config.app_socket_timeout * 1000); + (void) lttcomm_setsockopt_snd_timeout( + sock, the_config.app_socket_timeout * 1000); + } - /* - * Using message-based transmissions to ensure we don't - * have to deal with partially received messages. - */ - ret = lttng_fd_get(LTTNG_FD_APPS, 1); - if (ret < 0) { - ERR("Exhausted file descriptors allowed for applications."); - free(ust_cmd); - ret = close(sock); - if (ret) { - PERROR("close"); - } - sock = -1; - continue; + /* + * Set the CLOEXEC flag. Return code is useless because + * either way, the show must go on. + */ + (void) utils_set_fd_cloexec(sock); + + /* Create UST registration command for enqueuing */ + ust_cmd = zmalloc(); + if (ust_cmd == nullptr) { + PERROR("ust command zmalloc"); + ret = close(sock); + if (ret) { + PERROR("close"); } + sock = -1; + goto error; + } - health_code_update(); - ret = ust_app_recv_registration(sock, &ust_cmd->reg_msg); - if (ret < 0) { - free(ust_cmd); - /* Close socket of the application. */ - ret = close(sock); - if (ret) { - PERROR("close"); - } - lttng_fd_put(LTTNG_FD_APPS, 1); - sock = -1; - continue; + /* + * Using message-based transmissions to ensure we don't + * have to deal with partially received messages. + */ + ret = lttng_fd_get(LTTNG_FD_APPS, 1); + if (ret < 0) { + ERR("Exhausted file descriptors allowed for applications."); + free(ust_cmd); + ret = close(sock); + if (ret) { + PERROR("close"); } - health_code_update(); - - ust_cmd->sock = sock; sock = -1; + continue; + } - DBG("UST registration received with pid:%d ppid:%d uid:%d" - " gid:%d sock:%d name:%s (version %d.%d)", - ust_cmd->reg_msg.pid, ust_cmd->reg_msg.ppid, - ust_cmd->reg_msg.uid, ust_cmd->reg_msg.gid, - ust_cmd->sock, ust_cmd->reg_msg.name, - ust_cmd->reg_msg.major, ust_cmd->reg_msg.minor); - - /* - * Lock free enqueue the registration request. The red pill - * has been taken! This apps will be part of the *system*. - */ - cds_wfcq_head_ptr_t head; - head.h = &thread_state->ust_cmd_queue->head; - cds_wfcq_enqueue(head, - &thread_state->ust_cmd_queue->tail, - &ust_cmd->node); - - /* - * Wake the registration queue futex. Implicit memory - * barrier with the exchange in cds_wfcq_enqueue. - */ - futex_nto1_wake(&thread_state->ust_cmd_queue->futex); - } else if (revents & (LPOLLERR | LPOLLHUP | LPOLLRDHUP)) { - ERR("Register apps socket poll error"); - goto error; - } else { - ERR("Unexpected poll events %u for sock %d", revents, pollfd); - goto error; + health_code_update(); + ret = ust_app_recv_registration(sock, &ust_cmd->reg_msg); + if (ret < 0) { + free(ust_cmd); + /* Close socket of the application. */ + ret = close(sock); + if (ret) { + PERROR("close"); + } + lttng_fd_put(LTTNG_FD_APPS, 1); + sock = -1; + continue; } + health_code_update(); + + ust_cmd->sock = sock; + sock = -1; + + DBG("UST registration received with pid:%d ppid:%d uid:%d" + " gid:%d sock:%d name:%s (version %d.%d)", + ust_cmd->reg_msg.pid, + ust_cmd->reg_msg.ppid, + ust_cmd->reg_msg.uid, + ust_cmd->reg_msg.gid, + ust_cmd->sock, + ust_cmd->reg_msg.name, + ust_cmd->reg_msg.major, + ust_cmd->reg_msg.minor); + + /* + * Lock free enqueue the registration request. The red pill + * has been taken! This apps will be part of the *system*. + */ + cds_wfcq_head_ptr_t head; + head.h = &thread_state->ust_cmd_queue->head; + cds_wfcq_enqueue( + head, &thread_state->ust_cmd_queue->tail, &ust_cmd->node); + + /* + * Wake the registration queue futex. Implicit memory + * barrier with the exchange in cds_wfcq_enqueue. + */ + futex_nto1_wake(&thread_state->ust_cmd_queue->futex); + } else if (revents & (LPOLLERR | LPOLLHUP | LPOLLRDHUP)) { + ERR("Register apps socket poll error"); + goto error; + } else { + ERR("Unexpected poll events %u for sock %d", revents, pollfd); + goto error; } } } @@ -371,7 +371,7 @@ error_create_poll: ERR("Health error occurred in %s", __func__); } health_unregister(the_health_sessiond); - return NULL; + return nullptr; } static bool shutdown_application_registration_thread(void *data) @@ -382,13 +382,12 @@ static bool shutdown_application_registration_thread(void *data) return notify_thread_pipe(write_fd) == 1; } -struct lttng_thread *launch_application_registration_thread( - struct ust_cmd_queue *cmd_queue) +struct lttng_thread *launch_application_registration_thread(struct ust_cmd_queue *cmd_queue) { int ret; struct lttng_pipe *quit_pipe; - struct thread_state *thread_state = NULL; - struct lttng_thread *thread = NULL; + struct thread_state *thread_state = nullptr; + struct lttng_thread *thread = nullptr; const bool is_root = (getuid() == 0); int application_socket = -1; @@ -410,10 +409,10 @@ struct lttng_thread *launch_application_registration_thread( sem_init(&thread_state->ready, 0, 0); thread = lttng_thread_create("UST application registration", - thread_application_registration, - shutdown_application_registration_thread, - cleanup_application_registration_thread, - thread_state); + thread_application_registration, + shutdown_application_registration_thread, + cleanup_application_registration_thread, + thread_state); if (!thread) { goto error; } @@ -424,7 +423,7 @@ struct lttng_thread *launch_application_registration_thread( */ application_socket = -1; if (!wait_thread_status(thread_state)) { - thread_state = NULL; + thread_state = nullptr; goto error; } @@ -432,8 +431,8 @@ struct lttng_thread *launch_application_registration_thread( ret = notify_ust_apps(1, is_root); if (ret < 0) { ERR("Failed to notify applications or create the wait shared memory.\n" - "Execution continues but there might be problems for already\n" - "running applications that wishes to register."); + "Execution continues but there might be problems for already\n" + "running applications that wishes to register."); } return thread; @@ -446,5 +445,5 @@ error: } } error_alloc: - return NULL; + return nullptr; }