X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=src%2Fcommon%2Fconsumer%2Fconsumer-timer.c;h=06c9f1a1e007e3c4d18b9e9fc55962d48329adf0;hb=0b6112458ebcb3b09eef52e091ab165a4f9d23ca;hp=60ed94083e543a4d082e6f4e700f1ca57662120a;hpb=fd9e9d3000de71e4272562410b2b223212f225e1;p=lttng-tools.git diff --git a/src/common/consumer/consumer-timer.c b/src/common/consumer/consumer-timer.c index 60ed94083..06c9f1a1e 100644 --- a/src/common/consumer/consumer-timer.c +++ b/src/common/consumer/consumer-timer.c @@ -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(); @@ -633,7 +637,7 @@ int sample_channel_positions(struct lttng_consumer_channel *channel, sample_positions_cb sample, get_consumed_cb get_consumed, get_produced_cb get_produced) { - int ret; + int ret = 0; struct lttng_ht_iter iter; struct lttng_consumer_stream *stream; bool empty_channel = true; @@ -707,6 +711,7 @@ void monitor_timer(struct lttng_consumer_local_data *ctx, sample_positions_cb sample; get_consumed_cb get_consumed; get_produced_cb get_produced; + uint64_t lowest = 0, highest = 0; assert(channel); @@ -730,11 +735,13 @@ void monitor_timer(struct lttng_consumer_local_data *ctx, abort(); } - ret = sample_channel_positions(channel, &msg.highest, &msg.lowest, + ret = sample_channel_positions(channel, &highest, &lowest, sample, get_consumed, get_produced); if (ret) { return; } + msg.highest = highest; + msg.lowest = lowest; /* * Writes performed here are assumed to be atomic which is only @@ -782,7 +789,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) { @@ -836,6 +843,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); } @@ -844,10 +854,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; }