if (ret) {
PERROR("sigaddset monitor");
}
+ ret = sigaddset(mask, LTTNG_CONSUMER_SIG_EXIT);
+ if (ret) {
+ PERROR("sigaddset exit");
+ }
}
static int channel_monitor_pipe = -1;
if (ret == -1) {
PERROR("sigpending");
}
- if (!sigismember(&pending_set, LTTNG_CONSUMER_SIG_SWITCH)) {
+ if (!sigismember(&pending_set, signr)) {
break;
}
caa_cpu_relax();
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) {
ret = sample_channel_positions(channel, &msg.highest, &msg.lowest,
sample, get_consumed, get_produced);
if (ret) {
- goto end;
+ return;
}
/*
", (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)
/*
* 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)
{
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);
}
error_testpoint:
/* Only reached in testpoint error */
health_error();
+end:
health_unregister(health_consumerd);
-
rcu_unregister_thread();
-
- /* Never return */
return NULL;
}