X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fconsumer%2Fconsumer-timer.c;h=cfbf443128696ed3cc9657732d6c28047c9169d2;hb=e5212a1dde8128fb55fac4308d54cae575b8305e;hp=55129914ecb15882e3f15a8fb479f701715fb2ca;hpb=ea7913636cfa0190890dafc4983a98de24ede5dc;p=lttng-tools.git diff --git a/src/common/consumer/consumer-timer.c b/src/common/consumer/consumer-timer.c index 55129914e..cfbf44312 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; @@ -84,7 +88,7 @@ static int channel_monitor_pipe = -1; * deadlocks. */ static void metadata_switch_timer(struct lttng_consumer_local_data *ctx, - int sig, siginfo_t *si) + siginfo_t *si) { int ret; struct lttng_consumer_channel *channel; @@ -317,7 +321,7 @@ end: * Execute action on a live timer */ static void live_timer(struct lttng_consumer_local_data *ctx, - int sig, siginfo_t *si) + siginfo_t *si) { int ret; struct lttng_consumer_channel *channel; @@ -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(); @@ -629,17 +633,19 @@ int consumer_signal_init(void) static int sample_channel_positions(struct lttng_consumer_channel *channel, - uint64_t *_highest_use, uint64_t *_lowest_use, + uint64_t *_highest_use, uint64_t *_lowest_use, uint64_t *_total_consumed, 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; uint64_t high = 0, low = UINT64_MAX; struct lttng_ht *ht = consumer_data.stream_per_chan_id_ht; + *_total_consumed = 0; + rcu_read_lock(); cds_lfht_for_each_entry_duplicate(ht->ht, @@ -677,6 +683,15 @@ int sample_channel_positions(struct lttng_consumer_channel *channel, usage = produced - consumed; high = (usage > high) ? usage : high; low = (usage < low) ? usage : low; + + /* + * We don't use consumed here for 2 reasons: + * - output_written takes into account the padding written in the + * tracefiles when we stop the session; + * - the consumed position is not the accurate representation of what + * was extracted from a buffer in overwrite mode. + */ + *_total_consumed += stream->output_written; next: pthread_mutex_unlock(&stream->lock); } @@ -695,8 +710,7 @@ end: * Execute action on a monitor timer. */ static -void monitor_timer(struct lttng_consumer_local_data *ctx, - struct lttng_consumer_channel *channel) +void monitor_timer(struct lttng_consumer_channel *channel) { int ret; int channel_monitor_pipe = @@ -709,10 +723,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) { @@ -732,9 +745,9 @@ void monitor_timer(struct lttng_consumer_local_data *ctx, } ret = sample_channel_positions(channel, &msg.highest, &msg.lowest, - sample, get_consumed, get_produced); + &msg.total_consumed, sample, get_consumed, get_produced); if (ret) { - goto end; + return; } /* @@ -759,8 +772,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 +796,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) { @@ -826,19 +837,22 @@ void *consumer_timer_thread(void *data) } continue; } else if (signr == LTTNG_CONSUMER_SIG_SWITCH) { - metadata_switch_timer(ctx, info.si_signo, &info); + metadata_switch_timer(ctx, &info); } else if (signr == LTTNG_CONSUMER_SIG_TEARDOWN) { cmm_smp_mb(); CMM_STORE_SHARED(timer_signal.qs_done, 1); cmm_smp_mb(); DBG("Signal timer metadata thread teardown"); } else if (signr == LTTNG_CONSUMER_SIG_LIVE) { - live_timer(ctx, info.si_signo, &info); + live_timer(ctx, &info); } else if (signr == LTTNG_CONSUMER_SIG_MONITOR) { struct lttng_consumer_channel *channel; channel = info.si_value.sival_ptr; - monitor_timer(ctx, channel); + monitor_timer(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 +861,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; }