X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=src%2Fcommon%2Fconsumer%2Fconsumer-timer.c;h=8c39275d55b3af1d0978e3bad68c9c0326239a08;hb=3b4a46a4284f7d8a3ab12871cea143bc90d7121f;hp=3c9b3feb7d47f48820dcdbdb7d1b9cf819b98014;hpb=c8fea79c745d42ea8143b7020ae11b4fc2da0d8a;p=lttng-tools.git diff --git a/src/common/consumer/consumer-timer.c b/src/common/consumer/consumer-timer.c index 3c9b3feb7..8c39275d5 100644 --- a/src/common/consumer/consumer-timer.c +++ b/src/common/consumer/consumer-timer.c @@ -61,6 +61,10 @@ static void setmask(sigset_t *mask) if (ret) { PERROR("sigaddset live"); } + ret = sigaddset(mask, LTTNG_CONSUMER_SIG_EXIT); + if (ret) { + PERROR("sigaddset exit"); + } } /* @@ -148,7 +152,7 @@ int consumer_flush_kernel_index(struct lttng_consumer_stream *stream) } ret = kernctl_snapshot(stream->wait_fd); if (ret < 0) { - if (errno != EAGAIN && errno != ENODATA) { + if (ret != -EAGAIN && ret != -ENODATA) { PERROR("live timer kernel snapshot"); ret = -1; goto end; @@ -381,7 +385,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(); @@ -437,7 +441,7 @@ void consumer_timer_switch_start(struct lttng_consumer_channel *channel, channel->switch_timer_enabled = 1; its.it_value.tv_sec = switch_timer_interval / 1000000; - its.it_value.tv_nsec = switch_timer_interval % 1000000; + its.it_value.tv_nsec = (switch_timer_interval % 1000000) * 1000; its.it_interval.tv_sec = its.it_value.tv_sec; its.it_interval.tv_nsec = its.it_value.tv_nsec; @@ -494,7 +498,7 @@ void consumer_timer_live_start(struct lttng_consumer_channel *channel, channel->live_timer_enabled = 1; its.it_value.tv_sec = live_timer_interval / 1000000; - its.it_value.tv_nsec = live_timer_interval % 1000000; + its.it_value.tv_nsec = (live_timer_interval % 1000000) * 1000; its.it_interval.tv_sec = its.it_value.tv_sec; its.it_interval.tv_nsec = its.it_value.tv_nsec; @@ -546,7 +550,8 @@ int consumer_signal_init(void) /* * This thread is the sighandler for signals LTTNG_CONSUMER_SIG_SWITCH, - * LTTNG_CONSUMER_SIG_TEARDOWN and LTTNG_CONSUMER_SIG_LIVE. + * LTTNG_CONSUMER_SIG_TEARDOWN, LTTNG_CONSUMER_SIG_LIVE, and + * LTTNG_CONSUMER_SIG_EXIT. */ void *consumer_timer_thread(void *data) { @@ -589,6 +594,9 @@ void *consumer_timer_thread(void *data) DBG("Signal timer metadata thread teardown"); } else if (signr == LTTNG_CONSUMER_SIG_LIVE) { live_timer(ctx, info.si_signo, &info, NULL); + } else if (signr == LTTNG_CONSUMER_SIG_EXIT) { + assert(consumer_quit); + goto end; } else { ERR("Unexpected signal %d\n", info.si_signo); } @@ -597,10 +605,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; }