From: Jérémie Galarneau Date: Sun, 2 Dec 2018 21:20:16 +0000 (-0500) Subject: Launch agent management thread using lttng_thread X-Git-Tag: v2.12.0-rc1~717 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=8a7e45909a46d4aab3c3debde8f5ce2006c7d306 Launch agent management thread using lttng_thread Signed-off-by: Jérémie Galarneau --- diff --git a/src/bin/lttng-sessiond/agent-thread.c b/src/bin/lttng-sessiond/agent-thread.c index 51221c4c6..e648eda1e 100644 --- a/src/bin/lttng-sessiond/agent-thread.c +++ b/src/bin/lttng-sessiond/agent-thread.c @@ -31,6 +31,7 @@ #include "lttng-sessiond.h" #include "session.h" #include "utils.h" +#include "thread.h" static int agent_tracing_enabled = -1; @@ -295,12 +296,14 @@ static int write_agent_port(uint16_t port) /* * This thread manage application notify communication. */ -void *agent_thread_manage_registration(void *data) +static void *thread_agent_management(void *data) { int i, ret, pollfd; uint32_t revents, nb_fd; struct lttng_poll_event events; struct lttcomm_sock *reg_sock; + struct lttng_pipe *quit_pipe = data; + const int quit_pipe_read_fd = lttng_pipe_get_readfd(quit_pipe); DBG("[agent-thread] Manage agent application registration."); @@ -310,13 +313,18 @@ void *agent_thread_manage_registration(void *data) /* Agent initialization call MUST be called before starting the thread. */ assert(agent_apps_ht_by_sock); - /* Create pollset with size 2, quit pipe and socket. */ - ret = sessiond_set_thread_pollset(&events, 2); + /* Create pollset with size 2, quit pipe and registration socket. */ + ret = lttng_poll_create(&events, 2, LTTNG_CLOEXEC); if (ret < 0) { - sessiond_notify_ready(); goto error_poll_create; } + ret = lttng_poll_add(&events, quit_pipe_read_fd, + LPOLLIN | LPOLLERR); + if (ret < 0) { + goto error_tcp_socket; + } + reg_sock = init_tcp_socket(); if (reg_sock) { uint16_t port; @@ -381,8 +389,7 @@ restart: } /* Thread quit pipe has been closed. Killing thread. */ - ret = sessiond_check_thread_quit_pipe(pollfd, revents); - if (ret) { + if (pollfd == quit_pipe_read_fd) { goto exit; } @@ -446,9 +453,41 @@ error_tcp_socket: lttng_poll_clean(&events); error_poll_create: uatomic_set(&agent_tracing_enabled, 0); - DBG("[agent-thread] is cleaning up and stopping."); - + DBG("[agent-thread] Cleaning up and stopping."); + lttng_pipe_destroy(quit_pipe); rcu_thread_offline(); rcu_unregister_thread(); return NULL; } + +static bool shutdown_agent_management_thread(void *data) +{ + struct lttng_pipe *quit_pipe = data; + const int write_fd = lttng_pipe_get_writefd(quit_pipe); + + return notify_thread_pipe(write_fd) == 1; +} + +bool launch_agent_registration_thread(void) +{ + struct lttng_pipe *quit_pipe; + struct lttng_thread *thread; + + quit_pipe = lttng_pipe_open(FD_CLOEXEC); + if (!quit_pipe) { + goto error; + } + thread = lttng_thread_create("Agent management", + thread_agent_management, + shutdown_agent_management_thread, + quit_pipe); + if (!thread) { + goto error; + } + + lttng_thread_put(thread); + return true; +error: + lttng_pipe_destroy(quit_pipe); + return false; +} diff --git a/src/bin/lttng-sessiond/agent-thread.h b/src/bin/lttng-sessiond/agent-thread.h index 4bed47b37..7c33eddc9 100644 --- a/src/bin/lttng-sessiond/agent-thread.h +++ b/src/bin/lttng-sessiond/agent-thread.h @@ -22,17 +22,17 @@ #ifdef HAVE_LIBLTTNG_UST_CTL -void *agent_thread_manage_registration(void *data); +bool launch_agent_management_thread(void); bool agent_tracing_is_enabled(void); #else /* HAVE_LIBLTTNG_UST_CTL */ static inline -void *agent_thread_manage_registration(void *data) +bool launch_agent_management_thread(void) { - sessiond_notify_ready(); - return NULL; + return true; } + static inline bool agent_tracing_is_enabled(void) { diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c index 39800b51c..56d932da9 100644 --- a/src/bin/lttng-sessiond/main.c +++ b/src/bin/lttng-sessiond/main.c @@ -146,7 +146,6 @@ static int apps_cmd_notify_pipe[2] = { -1, -1 }; /* Pthread, Mutexes and Semaphores */ static pthread_t kernel_thread; -static pthread_t agent_reg_thread; static pthread_t load_session_thread; /* @@ -2447,14 +2446,9 @@ int main(int argc, char **argv) goto exit_apps_notify; } - /* Create agent registration thread. */ - ret = pthread_create(&agent_reg_thread, default_pthread_attr(), - agent_thread_manage_registration, (void *) NULL); - if (ret) { - errno = ret; - PERROR("pthread_create agent"); + /* Create agent management thread. */ + if (!launch_agent_management_thread()) { retval = -1; - stop_threads(); goto exit_agent_reg; } @@ -2520,13 +2514,6 @@ exit_load_session: } } exit_kernel: - - ret = pthread_join(agent_reg_thread, &status); - if (ret) { - errno = ret; - PERROR("pthread_join agent"); - retval = -1; - } exit_agent_reg: exit_apps_notify: exit_apps: