Fix: join consumer timer thread
[lttng-tools.git] / src / common / consumer / consumer-timer.c
index 09cf3629331d344e54c63a6d3b2a467c527cb648..e42940ed991fa60a6ec7e0e744ebd1033e203bf9 100644 (file)
@@ -21,7 +21,7 @@
 #include <inttypes.h>
 #include <signal.h>
 
-#include <lttng/ust-ctl.h>
+#include <bin/lttng-sessiond/ust-ctl.h>
 #include <bin/lttng-consumerd/health-consumerd.h>
 #include <common/common.h>
 #include <common/compat/endian.h>
@@ -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();
@@ -709,10 +713,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) {
@@ -734,7 +737,7 @@ void monitor_timer(struct lttng_consumer_local_data *ctx,
        ret = sample_channel_positions(channel, &msg.highest, &msg.lowest,
                        sample, get_consumed, get_produced);
        if (ret) {
-               goto end;
+               return;
        }
 
        /*
@@ -759,8 +762,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 +786,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)
 {
@@ -839,6 +840,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);
                }
@@ -847,10 +851,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;
 }
This page took 0.024607 seconds and 4 git commands to generate.