X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fconsumer%2Fconsumer-timer.c;h=e42940ed991fa60a6ec7e0e744ebd1033e203bf9;hp=09cf3629331d344e54c63a6d3b2a467c527cb648;hb=13675d0e093a96a7e7c0aa8c67029fa5e2ed9a68;hpb=e9404c27e7cc9d841785e6c4292c1add19fbc1cc diff --git a/src/common/consumer/consumer-timer.c b/src/common/consumer/consumer-timer.c index 09cf36293..e42940ed9 100644 --- a/src/common/consumer/consumer-timer.c +++ b/src/common/consumer/consumer-timer.c @@ -21,7 +21,7 @@ #include #include -#include +#include #include #include #include @@ -72,6 +72,10 @@ static void setmask(sigset_t *mask) if (ret) { PERROR("sigaddset monitor"); } + ret = sigaddset(mask, LTTNG_CONSUMER_SIG_EXIT); + if (ret) { + PERROR("sigaddset exit"); + } } static int channel_monitor_pipe = -1; @@ -394,7 +398,7 @@ void consumer_timer_signal_thread_qs(unsigned int signr) if (ret == -1) { PERROR("sigpending"); } - if (!sigismember(&pending_set, LTTNG_CONSUMER_SIG_SWITCH)) { + if (!sigismember(&pending_set, signr)) { break; } caa_cpu_relax(); @@ -709,10 +713,9 @@ void monitor_timer(struct lttng_consumer_local_data *ctx, get_produced_cb get_produced; assert(channel); - pthread_mutex_lock(&consumer_data.lock); if (channel_monitor_pipe < 0) { - goto end; + return; } switch (consumer_data.type) { @@ -734,7 +737,7 @@ void monitor_timer(struct lttng_consumer_local_data *ctx, ret = sample_channel_positions(channel, &msg.highest, &msg.lowest, sample, get_consumed, get_produced); if (ret) { - goto end; + return; } /* @@ -759,8 +762,6 @@ void monitor_timer(struct lttng_consumer_local_data *ctx, ", (highest = %" PRIu64 ", lowest = %"PRIu64")", channel->key, msg.highest, msg.lowest); } -end: - pthread_mutex_unlock(&consumer_data.lock); } int consumer_timer_thread_get_channel_monitor_pipe(void) @@ -785,7 +786,7 @@ end: /* * This thread is the sighandler for signals LTTNG_CONSUMER_SIG_SWITCH, * LTTNG_CONSUMER_SIG_TEARDOWN, LTTNG_CONSUMER_SIG_LIVE, and - * LTTNG_CONSUMER_SIG_MONITOR. + * LTTNG_CONSUMER_SIG_MONITOR, LTTNG_CONSUMER_SIG_EXIT. */ void *consumer_timer_thread(void *data) { @@ -839,6 +840,9 @@ void *consumer_timer_thread(void *data) channel = info.si_value.sival_ptr; monitor_timer(ctx, channel); + } else if (signr == LTTNG_CONSUMER_SIG_EXIT) { + assert(CMM_LOAD_SHARED(consumer_quit)); + goto end; } else { ERR("Unexpected signal %d\n", info.si_signo); } @@ -847,10 +851,8 @@ void *consumer_timer_thread(void *data) error_testpoint: /* Only reached in testpoint error */ health_error(); +end: health_unregister(health_consumerd); - rcu_unregister_thread(); - - /* Never return */ return NULL; }