X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fbin%2Flttng-consumerd%2Flttng-consumerd.c;h=59397594b914c2c99533ff408d77d9c824c08034;hb=f385ae0a8f5c34cc33ca57cdb412393f90f9c0a8;hp=b854aabac9923c9b832b81b338d933b2feafa6d7;hpb=9d035200e9006c4d4cf6951c54641e06c0bdf2bc;p=lttng-tools.git diff --git a/src/bin/lttng-consumerd/lttng-consumerd.c b/src/bin/lttng-consumerd/lttng-consumerd.c index b854aabac..59397594b 100644 --- a/src/bin/lttng-consumerd/lttng-consumerd.c +++ b/src/bin/lttng-consumerd/lttng-consumerd.c @@ -44,6 +44,7 @@ #include #include #include +#include #include #include @@ -51,8 +52,10 @@ /* TODO : support UST (all direct kernel-ctl accesses). */ -/* the two threads (receive fd, poll and metadata) */ -static pthread_t data_thread, metadata_thread, sessiond_thread; +/* threads (channel handling, poll, metadata, sessiond) */ + +static pthread_t channel_thread, data_thread, metadata_thread, sessiond_thread; +static pthread_t metadata_timer_thread; /* to count the number of times the user pressed ctrl+c */ static int sigintcount = 0; @@ -363,12 +366,31 @@ int main(int argc, char **argv) } lttng_consumer_set_error_sock(ctx, ret); + /* + * Block RT signals used for UST periodical metadata flush and the live + * timer in main, and create a dedicated thread to handle these signals. + */ + consumer_signal_init(); + + ctx->type = opt_type; + + /* Initialize communication library */ + lttcomm_init(); + + /* Create thread to manage channels */ + ret = pthread_create(&channel_thread, NULL, consumer_thread_channel_poll, + (void *) ctx); + if (ret != 0) { + perror("pthread_create"); + goto error; + } + /* 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; + goto metadata_error; } /* Create thread to manage the polling/writing of trace data */ @@ -387,6 +409,24 @@ int main(int argc, char **argv) goto sessiond_error; } + /* + * Create the thread to manage the UST metadata periodic timer and + * live timer. + */ + ret = pthread_create(&metadata_timer_thread, NULL, + consumer_timer_thread, (void *) ctx); + if (ret != 0) { + perror("pthread_create"); + goto metadata_timer_error; + } + + ret = pthread_detach(metadata_timer_thread); + if (ret) { + errno = ret; + perror("pthread_detach"); + } + +metadata_timer_error: ret = pthread_join(sessiond_thread, &status); if (ret != 0) { perror("pthread_join"); @@ -407,6 +447,13 @@ data_error: goto error; } +metadata_error: + ret = pthread_join(channel_thread, &status); + if (ret != 0) { + perror("pthread_join"); + goto error; + } + if (!ret) { ret = EXIT_SUCCESS; lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_EXIT_SUCCESS); @@ -415,7 +462,9 @@ data_error: error: ret = EXIT_FAILURE; - lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_EXIT_FAILURE); + if (ctx) { + lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_EXIT_FAILURE); + } end: lttng_consumer_destroy(ctx);