Fix: sessiond: use system LTTng-UST headers when available
[lttng-tools.git] / src / common / consumer / consumer-timer.c
index e42940ed991fa60a6ec7e0e744ebd1033e203bf9..dab30d4053ecbda6826521e592873cf5fa35a6ca 100644 (file)
@@ -21,7 +21,6 @@
 #include <inttypes.h>
 #include <signal.h>
 
-#include <bin/lttng-sessiond/ust-ctl.h>
 #include <bin/lttng-consumerd/health-consumerd.h>
 #include <common/common.h>
 #include <common/compat/endian.h>
@@ -88,7 +87,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;
@@ -321,7 +320,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;
@@ -633,17 +632,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,
@@ -681,6 +682,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);
        }
@@ -699,8 +709,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 =
@@ -711,6 +720,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, total_consumed = 0;
 
        assert(channel);
 
@@ -734,11 +744,14 @@ void monitor_timer(struct lttng_consumer_local_data *ctx,
                abort();
        }
 
-       ret = sample_channel_positions(channel, &msg.highest, &msg.lowest,
-                       sample, get_consumed, get_produced);
+       ret = sample_channel_positions(channel, &highest, &lowest,
+                       &total_consumed, sample, get_consumed, get_produced);
        if (ret) {
                return;
        }
+       msg.highest = highest;
+       msg.lowest = lowest;
+       msg.total_consumed = total_consumed;
 
        /*
         * Writes performed here are assumed to be atomic which is only
@@ -827,19 +840,19 @@ 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;
This page took 0.026215 seconds and 5 git commands to generate.