X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fbin%2Flttng-consumerd%2Flttng-consumerd.c;h=946fb02af2c1931ba95adb969593f81dcac19ad9;hb=6efae65ee1d5c6b048f0f4cd778d784d3857e459;hp=9f2f02feba03897b7462de3250c863ec2ec37b55;hpb=1ccfc0e3afa3de78f5b1cfda99869bb5e393ace6;p=lttng-tools.git diff --git a/src/bin/lttng-consumerd/lttng-consumerd.c b/src/bin/lttng-consumerd/lttng-consumerd.c index 9f2f02feb..946fb02af 100644 --- a/src/bin/lttng-consumerd/lttng-consumerd.c +++ b/src/bin/lttng-consumerd/lttng-consumerd.c @@ -43,17 +43,16 @@ #include #include -#include -#include +#include +#include #include -#include #include "lttng-consumerd.h" /* TODO : support UST (all direct kernel-ctl accesses). */ -/* the two threads (receive fd and poll) */ -static pthread_t threads[2]; +/* the two threads (receive fd, poll and metadata) */ +static pthread_t threads[3]; /* to count the number of times the user pressed ctrl+c */ static int sigintcount = 0; @@ -263,13 +262,31 @@ int main(int argc, char **argv) /* Daemonize */ if (opt_daemon) { + int i; + + /* + * fork + * child: setsid, close FD 0, 1, 2, chdir / + * parent: exit (if fork is successful) + */ ret = daemon(0, 0); if (ret < 0) { - perror("daemon"); + PERROR("daemon"); goto error; } + /* + * We are in the child. Make sure all other file + * descriptors are closed, in case we are called with + * more opened file descriptors than the standard ones. + */ + for (i = 3; i < sysconf(_SC_OPEN_MAX); i++) { + (void) close(i); + } } + /* Set up max poll set size */ + lttng_poll_set_max_size(); + if (strlen(command_sock_path) == 0) { switch (opt_type) { case LTTNG_CONSUMER_KERNEL: @@ -339,23 +356,31 @@ int main(int argc, char **argv) } lttng_consumer_set_error_sock(ctx, ret); - /* Create the thread to manage the receive of fd */ - ret = pthread_create(&threads[0], NULL, lttng_consumer_thread_receive_fds, + /* Create thread to manage the polling/writing of trace metadata */ + ret = pthread_create(&threads[0], NULL, consumer_thread_metadata_poll, (void *) ctx); if (ret != 0) { perror("pthread_create"); goto error; } - /* Create thread to manage the polling/writing of traces */ - ret = pthread_create(&threads[1], NULL, lttng_consumer_thread_poll_fds, + /* Create thread to manage the polling/writing of trace data */ + ret = pthread_create(&threads[1], NULL, consumer_thread_data_poll, + (void *) ctx); + if (ret != 0) { + perror("pthread_create"); + goto error; + } + + /* Create the thread to manage the receive of fd */ + ret = pthread_create(&threads[2], NULL, consumer_thread_sessiond_poll, (void *) ctx); if (ret != 0) { perror("pthread_create"); goto error; } - for (i = 0; i < 2; i++) { + for (i = 0; i < 3; i++) { ret = pthread_join(threads[i], &status); if (ret != 0) { perror("pthread_join"); @@ -363,12 +388,12 @@ int main(int argc, char **argv) } } ret = EXIT_SUCCESS; - lttng_consumer_send_error(ctx, CONSUMERD_EXIT_SUCCESS); + lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_EXIT_SUCCESS); goto end; error: ret = EXIT_FAILURE; - lttng_consumer_send_error(ctx, CONSUMERD_EXIT_FAILURE); + lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_EXIT_FAILURE); end: lttng_consumer_destroy(ctx);