X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Fcreate.c;h=3b679ca71d75e77c3a80bad4b9237fab7f068d61;hb=bbd44cae042d871887fb7207c5144f68d47cb3a8;hp=94c1c61836f5edd61dc5c4b8784d346875d0284b;hpb=6a0caa9baf6913eacea486ac84f14ee65c62108b;p=lttng-tools.git diff --git a/src/bin/lttng/commands/create.c b/src/bin/lttng/commands/create.c index 94c1c6183..3b679ca71 100644 --- a/src/bin/lttng/commands/create.c +++ b/src/bin/lttng/commands/create.c @@ -28,6 +28,7 @@ #include #include #include +#include #include @@ -562,14 +563,13 @@ static int spawn_sessiond(char *pathname) pid_t pid; MSG("Spawning a session daemon"); - recv_child_signal = 0; pid = fork(); if (pid == 0) { /* - * Spawn session daemon and tell - * it to signal us when ready. + * Spawn session daemon in daemon mode. */ - execlp(pathname, "lttng-sessiond", "--sig-parent", "--quiet", NULL); + execlp(pathname, "lttng-sessiond", + "--daemonize", NULL); /* execlp only returns if error happened */ if (errno == ENOENT) { ERR("No session daemon found. Use --sessiond-path."); @@ -579,25 +579,34 @@ static int spawn_sessiond(char *pathname) kill(getppid(), SIGTERM); /* wake parent */ exit(EXIT_FAILURE); } else if (pid > 0) { - sessiond_pid = pid; - /* - * Wait for lttng-sessiond to start. We need to use a flag to check if - * the signal has been sent to us, because the child can be scheduled - * before the parent, and thus send the signal before this check. In - * the signal handler, we set the recv_child_signal flag, so anytime we - * check it after the fork is fine. Note that sleep() is interrupted - * before the 1 second delay as soon as the signal is received, so it - * will not cause visible delay for the user. - */ - while (!recv_child_signal) { - sleep(1); - } + int status; + /* - * The signal handler will nullify sessiond_pid on SIGCHLD + * In daemon mode (--daemonize), sessiond only exits when + * it's ready to accept commands. */ - if (!sessiond_pid) { - exit(EXIT_FAILURE); + for (;;) { + waitpid(pid, &status, 0); + + if (WIFSIGNALED(status)) { + ERR("Session daemon was killed by signal %d", + WTERMSIG(status)); + ret = -1; + goto end; + } else if (WIFEXITED(status)) { + DBG("Session daemon terminated normally (exit status: %d)", + WEXITSTATUS(status)); + + if (WEXITSTATUS(status) != 0) { + ERR("Session daemon terminated with an error (exit status: %d)", + WEXITSTATUS(status)); + ret = -1; + goto end; + } + break; + } } + goto end; } else { PERROR("fork");