Backported to glibc 2.8
[lttng-tools.git] / src / common / consumer-timer.c
index b02ccbb115a9cdd6337f5214bcd49b8d268aed79..c659bf63333a0de56fc568f99c167fb55e12e24c 100644 (file)
 #include <inttypes.h>
 #include <signal.h>
 
+#include <bin/lttng-consumerd/health-consumerd.h>
 #include <common/common.h>
+#include <common/compat/endian.h>
 #include <common/kernel-ctl/kernel-ctl.h>
 #include <common/kernel-consumer/kernel-consumer.h>
 #include <common/consumer-stream.h>
 
 #include "consumer-timer.h"
+#include "consumer-testpoint.h"
 #include "ust-consumer/ust-consumer.h"
-#include "../bin/lttng-consumerd/health-consumerd.h"
 
 static struct timer_signal_data timer_signal = {
        .tid = 0,
@@ -115,7 +117,7 @@ static void metadata_switch_timer(struct lttng_consumer_local_data *ctx,
 static int send_empty_index(struct lttng_consumer_stream *stream, uint64_t ts)
 {
        int ret;
-       struct lttng_packet_index index;
+       struct ctf_packet_index index;
 
        memset(&index, 0, sizeof(index));
        index.timestamp_end = htobe64(ts);
@@ -153,8 +155,8 @@ static int check_kernel_stream(struct lttng_consumer_stream *stream)
        }
        ret = kernctl_snapshot(stream->wait_fd);
        if (ret < 0) {
-               if (errno != EAGAIN) {
-                       ERR("Taking kernel snapshot");
+               if (errno != EAGAIN && errno != ENODATA) {
+                       PERROR("live timer kernel snapshot");
                        ret = -1;
                        goto error_unlock;
                }
@@ -397,7 +399,7 @@ void consumer_timer_live_start(struct lttng_consumer_channel *channel,
        assert(channel);
        assert(channel->key);
 
-       if (live_timer_interval == 0) {
+       if (live_timer_interval <= 0) {
                return;
        }
 
@@ -472,12 +474,22 @@ void *consumer_timer_thread(void *data)
 
        health_register(health_consumerd, HEALTH_CONSUMERD_TYPE_METADATA_TIMER);
 
+       if (testpoint(consumerd_thread_metadata_timer)) {
+               goto error_testpoint;
+       }
+
+       health_code_update();
+
        /* Only self thread will receive signal mask. */
        setmask(&mask);
        CMM_STORE_SHARED(timer_signal.tid, pthread_self());
 
        while (1) {
+               health_code_update();
+
+               health_poll_entry();
                signr = sigwaitinfo(&mask, &info);
+               health_poll_exit();
                if (signr == -1) {
                        if (errno != EINTR) {
                                PERROR("sigwaitinfo");
@@ -497,7 +509,9 @@ void *consumer_timer_thread(void *data)
                }
        }
 
-       /* Currently never reached */
+error_testpoint:
+       /* Only reached in testpoint error */
+       health_error();
        health_unregister(health_consumerd);
 
        /* Never return */
This page took 0.024099 seconds and 4 git commands to generate.