X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-consumerd%2Flttng-consumerd.c;h=4d02c842798f65c1024b9326a248493ea60204af;hp=e5d7ba1c60051aebdd6c1f435b6c692294065e6f;hb=81ffed9c49284d91e2fa05a88050e187d5b325ae;hpb=f02e1e8a5820da2eda835add020f92ca8d32c973 diff --git a/src/bin/lttng-consumerd/lttng-consumerd.c b/src/bin/lttng-consumerd/lttng-consumerd.c index e5d7ba1c6..4d02c8427 100644 --- a/src/bin/lttng-consumerd/lttng-consumerd.c +++ b/src/bin/lttng-consumerd/lttng-consumerd.c @@ -44,14 +44,15 @@ #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 data_thread, metadata_thread, sessiond_thread; /* to count the number of times the user pressed ctrl+c */ static int sigintcount = 0; @@ -78,6 +79,14 @@ static void sighandler(int sig) return; } + /* + * Ignore SIGPIPE because it should not stop the consumer whenever a + * SIGPIPE is catched through a FD operation. + */ + if (sig == SIGPIPE) { + return; + } + lttng_consumer_should_exit(ctx); } @@ -251,7 +260,6 @@ static void set_ulimit(void) */ int main(int argc, char **argv) { - int i; int ret = 0; void *status; @@ -283,6 +291,9 @@ int main(int argc, char **argv) } } + /* Set up max poll set size */ + lttng_poll_set_max_size(); + if (strlen(command_sock_path) == 0) { switch (opt_type) { case LTTNG_CONSUMER_KERNEL: @@ -352,36 +363,59 @@ 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(&metadata_thread, 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(&data_thread, NULL, consumer_thread_data_poll, + (void *) ctx); + if (ret != 0) { + perror("pthread_create"); + goto data_error; + } + + /* Create the thread to manage the receive of fd */ + ret = pthread_create(&sessiond_thread, NULL, consumer_thread_sessiond_poll, (void *) ctx); if (ret != 0) { perror("pthread_create"); + goto sessiond_error; + } + + ret = pthread_join(sessiond_thread, &status); + if (ret != 0) { + perror("pthread_join"); goto error; } - for (i = 0; i < 2; i++) { - ret = pthread_join(threads[i], &status); - if (ret != 0) { - perror("pthread_join"); - goto error; - } +sessiond_error: + ret = pthread_join(data_thread, &status); + if (ret != 0) { + perror("pthread_join"); + goto error; + } + +data_error: + ret = pthread_join(metadata_thread, &status); + if (ret != 0) { + perror("pthread_join"); + goto error; + } + + if (!ret) { + ret = EXIT_SUCCESS; + lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_EXIT_SUCCESS); + goto end; } - ret = EXIT_SUCCESS; - lttng_consumer_send_error(ctx, 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);