Launch agent management thread using lttng_thread
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Sun, 2 Dec 2018 21:20:16 +0000 (16:20 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Wed, 5 Dec 2018 20:16:21 +0000 (15:16 -0500)
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-sessiond/agent-thread.c
src/bin/lttng-sessiond/agent-thread.h
src/bin/lttng-sessiond/main.c

index 51221c4c623fc34a08f1f9c9cb8e90d4177cd8f6..e648eda1ebfe9bcb95d3c7de516f70efad696edc 100644 (file)
@@ -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;
+}
index 4bed47b3702743575a059d300a01a95ae57cdd38..7c33eddc9ea1e36f99341448d92f845bd856d47c 100644 (file)
 
 #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)
 {
index 39800b51ccba4cefaec88d13e803620da6a02b10..56d932da9f7a961a2274d63d7ee32b6f8ce877ed 100644 (file)
@@ -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:
This page took 0.042341 seconds and 5 git commands to generate.