Fix: agent thread poll set creation failure results in deadlock
[lttng-tools.git] / src / bin / lttng-sessiond / agent-thread.c
index 39d2ec4a05bd1297c31e2ac7036600772ea38ffa..189e3ba6b671d38db58b19b6c998530ebcc3fae0 100644 (file)
@@ -32,6 +32,8 @@
 #include "session.h"
 #include "utils.h"
 
+static int agent_tracing_enabled = -1;
+
 /*
  * Note that there is not port here. It's set after this URI is parsed so we
  * can let the user define a custom one. However, localhost is ALWAYS the
@@ -223,6 +225,15 @@ error:
        return ret;
 }
 
+bool agent_tracing_is_enabled(void)
+{
+       int enabled;
+
+       enabled = uatomic_read(&agent_tracing_enabled);
+       assert(enabled != -1);
+       return enabled == 1;
+}
+
 /*
  * This thread manage application notify communication.
  */
@@ -244,10 +255,18 @@ void *agent_thread_manage_registration(void *data)
        /* Create pollset with size 2, quit pipe and socket. */
        ret = sessiond_set_thread_pollset(&events, 2);
        if (ret < 0) {
+               sessiond_notify_ready();
                goto error_poll_create;
        }
 
        reg_sock = init_tcp_socket();
+       uatomic_set(&agent_tracing_enabled, !!reg_sock);
+
+       /*
+        * Signal that the agent thread is ready. The command thread
+        * may start to query whether or not agent tracing is enabled.
+        */
+       sessiond_notify_ready();
        if (!reg_sock) {
                goto error_tcp_socket;
        }
@@ -347,6 +366,7 @@ restart:
        }
 
 exit:
+       uatomic_set(&agent_tracing_enabled, 0);
        /* Whatever happens, try to delete it and exit. */
        (void) lttng_poll_del(&events, reg_sock->fd);
 error:
This page took 0.030233 seconds and 4 git commands to generate.