Fix: report initialization error of client thread
[lttng-tools.git] / src / bin / lttng-sessiond / register.c
index b75db4ed9533f9c0e73025602b3729514d89d111..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.
@@ -361,7 +379,7 @@ static bool shutdown_application_registration_thread(void *data)
        return notify_thread_pipe(write_fd) == 1;
 }
 
-bool launch_application_registration_thread(
+struct lttng_thread *launch_application_registration_thread(
                struct ust_cmd_queue *cmd_queue)
 {
        struct lttng_pipe *quit_pipe;
@@ -379,6 +397,7 @@ bool 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,9 +407,9 @@ bool launch_application_registration_thread(
        if (!thread) {
                goto error;
        }
-       lttng_thread_put(thread);
-       return true;
+       wait_until_thread_is_ready(notifiers);
+       return thread;
 error:
        cleanup_application_registration_thread(notifiers);
-       return false;
+       return NULL;
 }
This page took 0.024361 seconds and 4 git commands to generate.