Make the launch of the application registration thread blocking
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 6 Dec 2018 17:03:48 +0000 (12:03 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 6 Dec 2018 21:34:34 +0000 (16:34 -0500)
Waiting for the application registration thread to be ready to
accept application connection ensures that the application
registration socket is created and being listened-to before the parent
is signalled.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-sessiond/register.c

index 6776019c68d3cdef3cfd4439906363a56b345c39..319514a366839460f9e1bbf176fd0f21793a817f 100644 (file)
@@ -37,6 +37,7 @@
 struct thread_notifiers {
        struct lttng_pipe *quit_pipe;
        struct ust_cmd_queue *ust_cmd_queue;
+       sem_t ready;
 };
 
 /*
@@ -113,6 +114,21 @@ static void cleanup_application_registration_thread(void *data)
        free(notifiers);
 }
 
+static
+void mark_thread_as_ready(struct thread_notifiers *notifiers)
+{
+       DBG("Marking application registration thread as ready");
+       sem_post(&notifiers->ready);
+}
+
+static
+void wait_until_thread_is_ready(struct thread_notifiers *notifiers)
+{
+       DBG("Waiting for application registration thread to be ready");
+       sem_wait(&notifiers->ready);
+       DBG("Application registration thread is ready");
+}
+
 /*
  * This thread manage application registration.
  */
@@ -150,6 +166,8 @@ static void *thread_application_registration(void *data)
                goto error_listen;
        }
 
+       mark_thread_as_ready(notifiers);
+
        /*
         * Pass 2 as size here for the thread quit pipe and apps_sock. Nothing
         * more will be added to this poll set.
@@ -379,6 +397,7 @@ struct lttng_thread *launch_application_registration_thread(
        }
        notifiers->quit_pipe = quit_pipe;
        notifiers->ust_cmd_queue = cmd_queue;
+       sem_init(&notifiers->ready, 0, 0);
 
        thread = lttng_thread_create("UST application registration",
                        thread_application_registration,
@@ -388,6 +407,7 @@ struct lttng_thread *launch_application_registration_thread(
        if (!thread) {
                goto error;
        }
+       wait_until_thread_is_ready(notifiers);
        return thread;
 error:
        cleanup_application_registration_thread(notifiers);
This page took 0.026682 seconds and 4 git commands to generate.