X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-consumerd%2Flttng-consumerd.c;h=ddd07a14279eb3e88bc93b5497e8989a08cb2b3a;hp=1636b9c0d22777798ff220df010c4bc5ca6c9634;hb=929f71ec24b58045319473f050a7f235f726ec78;hpb=1a1a34b40ab10a195633b1ed5e2e9b42fdae0a78 diff --git a/src/bin/lttng-consumerd/lttng-consumerd.c b/src/bin/lttng-consumerd/lttng-consumerd.c index 1636b9c0d..ddd07a142 100644 --- a/src/bin/lttng-consumerd/lttng-consumerd.c +++ b/src/bin/lttng-consumerd/lttng-consumerd.c @@ -56,6 +56,7 @@ static pthread_t channel_thread, data_thread, metadata_thread, sessiond_thread, metadata_timer_thread, health_thread; +static bool metadata_timer_thread_online; /* to count the number of times the user pressed ctrl+c */ static int sigintcount = 0; @@ -99,14 +100,6 @@ static void sighandler(int sig) return; } - /* - * Ignore SIGPIPE because it should not stop the consumer whenever a - * SIGPIPE is caught through a FD operation. - */ - if (sig == SIGPIPE) { - return; - } - if (ctx) { lttng_consumer_should_exit(ctx); } @@ -127,9 +120,10 @@ static int set_signal_handler(void) return ret; } - sa.sa_handler = sighandler; sa.sa_mask = sigset; sa.sa_flags = 0; + + sa.sa_handler = sighandler; if ((ret = sigaction(SIGTERM, &sa, NULL)) < 0) { PERROR("sigaction"); return ret; @@ -140,6 +134,7 @@ static int set_signal_handler(void) return ret; } + sa.sa_handler = SIG_IGN; if ((ret = sigaction(SIGPIPE, &sa, NULL)) < 0) { PERROR("sigaction"); return ret; @@ -257,7 +252,7 @@ static int parse_args(int argc, char **argv) lttng_opt_quiet = 1; break; case 'v': - lttng_opt_verbose = 1; + lttng_opt_verbose = 3; break; case 'V': fprintf(stdout, "%s\n", VERSION); @@ -314,6 +309,8 @@ int main(int argc, char **argv) void *status; struct lttng_consumer_local_data *tmp_ctx; + rcu_register_thread(); + if (set_signal_handler()) { retval = -1; goto exit_set_signal_handler; @@ -414,7 +411,7 @@ int main(int argc, char **argv) set_ulimit(); } - if (run_as_create_worker(argv[0]) < 0) { + if (run_as_create_worker(argv[0], NULL, NULL) < 0) { goto exit_init_data; } @@ -510,6 +507,20 @@ int main(int argc, char **argv) } cmm_smp_mb(); /* Read ready before following operations */ + /* + * 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) { + errno = ret; + PERROR("pthread_create"); + retval = -1; + goto exit_metadata_timer_thread; + } + metadata_timer_thread_online = true; + /* Create thread to manage channels */ ret = pthread_create(&channel_thread, default_pthread_attr(), consumer_thread_channel_poll, @@ -542,7 +553,7 @@ int main(int argc, char **argv) goto exit_data_thread; } - /* Create the thread to manage the receive of fd */ + /* Create the thread to manage the reception of fds */ ret = pthread_create(&sessiond_thread, default_pthread_attr(), consumer_thread_sessiond_poll, (void *) ctx); @@ -553,34 +564,12 @@ int main(int argc, char **argv) goto exit_sessiond_thread; } - /* - * Create the thread to manage the UST metadata periodic timer and - * live timer. - */ - ret = pthread_create(&metadata_timer_thread, default_pthread_attr(), - consumer_timer_thread, (void *) ctx); - if (ret) { - errno = ret; - PERROR("pthread_create"); - retval = -1; - goto exit_metadata_timer_thread; - } - - ret = pthread_detach(metadata_timer_thread); - if (ret) { - errno = ret; - PERROR("pthread_detach"); - retval = -1; - goto exit_metadata_timer_detach; - } /* * This is where we start awaiting program completion (e.g. through * signal that asks threads to teardown. */ -exit_metadata_timer_detach: -exit_metadata_timer_thread: ret = pthread_join(sessiond_thread, &status); if (ret) { errno = ret; @@ -613,6 +602,8 @@ exit_metadata_thread: } exit_channel_thread: +exit_metadata_timer_thread: + ret = pthread_join(health_thread, &status); if (ret) { errno = ret; @@ -625,11 +616,45 @@ exit_health_thread: exit_health_pipe: exit_init_data: + /* + * Wait for all pending call_rcu work to complete before tearing + * down data structures. call_rcu worker may be trying to + * perform lookups in those structures. + */ + rcu_barrier(); + lttng_consumer_cleanup(); + /* + * Tearing down the metadata timer thread in a + * non-fully-symmetric fashion compared to its creation in case + * lttng_consumer_cleanup() ends up tearing down timers (which + * requires the timer thread to be alive). + */ + if (metadata_timer_thread_online) { + /* + * Ensure the metadata timer thread exits only after all other + * threads are gone, because it is required to perform timer + * teardown synchronization. + */ + kill(getpid(), LTTNG_CONSUMER_SIG_EXIT); + ret = pthread_join(metadata_timer_thread, &status); + if (ret) { + errno = ret; + PERROR("pthread_join metadata_timer_thread"); + retval = -1; + } + ret = consumer_timer_thread_get_channel_monitor_pipe(); + if (ret >= 0) { + ret = close(ret); + if (ret) { + PERROR("close channel monitor pipe"); + } + } + metadata_timer_thread_online = false; + } tmp_ctx = ctx; ctx = NULL; cmm_barrier(); /* Clear ctx for signal handler. */ lttng_consumer_destroy(tmp_ctx); - lttng_consumer_cleanup(); if (health_consumerd) { health_app_destroy(health_consumerd); @@ -643,6 +668,8 @@ exit_health_consumerd_cleanup: exit_options: exit_set_signal_handler: + rcu_unregister_thread(); + if (!retval) { exit(EXIT_SUCCESS); } else {