/* Argument variables */
int lttng_opt_quiet; /* not static in error.h */
int lttng_opt_verbose; /* not static in error.h */
+int lttng_opt_mi; /* not static in error.h */
+
static int opt_daemon;
static const char *progname;
static char command_sock_path[PATH_MAX]; /* Global command socket path */
return;
}
- lttng_consumer_should_exit(ctx);
+ if (ctx) {
+ lttng_consumer_should_exit(ctx);
+ }
}
/*
{
int ret = 0;
void *status;
+ struct lttng_consumer_local_data *tmp_ctx;
/* Parse arguments */
progname = argv[0];
error_health_pipe:
if (!ret) {
ret = EXIT_SUCCESS;
- lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_EXIT_SUCCESS);
goto end;
}
error:
ret = EXIT_FAILURE;
- if (ctx) {
- lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_EXIT_FAILURE);
- }
end:
- lttng_consumer_destroy(ctx);
+ tmp_ctx = ctx;
+ ctx = NULL;
+ cmm_barrier(); /* Clear ctx for signal handler. */
+ lttng_consumer_destroy(tmp_ctx);
lttng_consumer_cleanup();
if (health_consumerd) {
health_app_destroy(health_consumerd);
}
+ /* Ensure all prior call_rcu are done. */
+ rcu_barrier();
return ret;
}