X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Fmain.c;h=81f10b78368c46401085477a51b799f90cf8fb19;hp=338341ddaceeae4d6203f43fdf63a80d685ba5a8;hb=26c9d55e1367d3aff6e501b5a1295edd1ccbc210;hpb=b8aa16822f579a6e15b41d2761801a0a65d5f2a5 diff --git a/src/bin/lttng-relayd/main.c b/src/bin/lttng-relayd/main.c index 338341dda..81f10b783 100644 --- a/src/bin/lttng-relayd/main.c +++ b/src/bin/lttng-relayd/main.c @@ -49,6 +49,7 @@ #include #include #include +#include #include "lttng-relayd.h" @@ -73,6 +74,7 @@ static int thread_quit_pipe[2] = { -1, -1 }; */ static int relay_cmd_pipe[2] = { -1, -1 }; +/* Shared between threads */ static int dispatch_thread_exit; static pthread_t listener_thread; @@ -105,6 +107,7 @@ void usage(void) fprintf(stderr, " -d, --daemonize Start as a daemon.\n"); fprintf(stderr, " -C, --control-port Control port listening (URI)\n"); fprintf(stderr, " -D, --data-port Data port listening (URI)\n"); + fprintf(stderr, " -o, --output Output path for traces (PATH)\n"); fprintf(stderr, " -v, --verbose Verbose mode. Activate DBG() macro.\n"); } @@ -116,12 +119,13 @@ int parse_args(int argc, char **argv) char *default_address; static struct option long_options[] = { - { "control-port", 1, 0, 'C' }, - { "data-port", 1, 0, 'D' }, - { "daemonize", 0, 0, 'd' }, - { "output", 1, 0, 'o' }, - { "verbose", 0, 0, 'v' }, - { NULL, 0, 0, 0 } + { "control-port", 1, 0, 'C', }, + { "data-port", 1, 0, 'D', }, + { "daemonize", 0, 0, 'd', }, + { "help", 0, 0, 'h', }, + { "output", 1, 0, 'o', }, + { "verbose", 0, 0, 'v', }, + { NULL, 0, 0, 0 }, }; while (1) { @@ -226,18 +230,13 @@ exit: static void cleanup(void) { - int i, ret; - DBG("Cleaning up"); - for (i = 0; i < 2; i++) { - if (thread_quit_pipe[i] >= 0) { - ret = close(thread_quit_pipe[i]); - if (ret) { - PERROR("close"); - } - } - } + /* Close thread quit pipes */ + utils_close_pipe(thread_quit_pipe); + + /* Close relay cmd pipes */ + utils_close_pipe(relay_cmd_pipe); } /* @@ -248,7 +247,9 @@ int notify_thread_pipe(int wpipe) { int ret; - ret = write(wpipe, "!", 1); + do { + ret = write(wpipe, "!", 1); + } while (ret < 0 && errno == EINTR); if (ret < 0) { PERROR("write poll pipe"); } @@ -272,7 +273,7 @@ void stop_threads(void) } /* Dispatch thread */ - dispatch_thread_exit = 1; + CMM_STORE_SHARED(dispatch_thread_exit, 1); futex_nto1_wake(&relay_cmd_queue.futex); } @@ -349,23 +350,10 @@ int set_signal_handler(void) static int init_thread_quit_pipe(void) { - int ret, i; - - ret = pipe(thread_quit_pipe); - if (ret < 0) { - PERROR("thread quit pipe"); - goto error; - } + int ret; - for (i = 0; i < 2; i++) { - ret = fcntl(thread_quit_pipe[i], F_SETFD, FD_CLOEXEC); - if (ret < 0) { - PERROR("fcntl"); - goto error; - } - } + ret = utils_create_pipe_cloexec(thread_quit_pipe); -error: return ret; } @@ -621,7 +609,7 @@ void *relay_thread_dispatcher(void *data) DBG("[thread] Relay dispatcher started"); - while (!dispatch_thread_exit) { + while (!CMM_LOAD_SHARED(dispatch_thread_exit)) { /* Atomically prepare the queue futex */ futex_nto1_prepare(&relay_cmd_queue.futex); @@ -642,8 +630,10 @@ void *relay_thread_dispatcher(void *data) * call is blocking so we can be assured that the data will be read * at some point in time or wait to the end of the world :) */ - ret = write(relay_cmd_pipe[1], relay_cmd, - sizeof(struct relay_command)); + do { + ret = write(relay_cmd_pipe[1], relay_cmd, + sizeof(struct relay_command)); + } while (ret < 0 && errno == EINTR); free(relay_cmd); if (ret < 0) { PERROR("write cmd pipe"); @@ -1069,8 +1059,10 @@ int relay_recv_metadata(struct lttcomm_relayd_hdr *recv_hdr, goto end; } - ret = write(metadata_stream->fd, metadata_struct->payload, - payload_size); + do { + ret = write(metadata_stream->fd, metadata_struct->payload, + payload_size); + } while (ret < 0 && errno == EINTR); if (ret < (payload_size)) { ERR("Relay error writing metadata on file"); ret = -1; @@ -1204,7 +1196,9 @@ int relay_process_data(struct relay_command *cmd, struct lttng_ht *streams_ht) goto end; } - ret = write(stream->fd, data_buffer, data_size); + do { + ret = write(stream->fd, data_buffer, data_size); + } while (ret < 0 && errno == EINTR); if (ret < data_size) { ERR("Relay error writing data to file"); ret = -1; @@ -1442,23 +1436,10 @@ error_poll_create: */ static int create_relay_cmd_pipe(void) { - int ret, i; - - ret = pipe(relay_cmd_pipe); - if (ret < 0) { - PERROR("relay cmd pipe"); - goto error; - } + int ret; - for (i = 0; i < 2; i++) { - ret = fcntl(relay_cmd_pipe[i], F_SETFD, FD_CLOEXEC); - if (ret < 0) { - PERROR("fcntl relay_cmd_pipe"); - goto error; - } - } + ret = utils_create_pipe_cloexec(relay_cmd_pipe); -error: return ret; } @@ -1478,7 +1459,7 @@ int main(int argc, char **argv) /* Parse arguments */ progname = argv[0]; if ((ret = parse_args(argc, argv) < 0)) { - goto error; + goto exit; } if ((ret = set_signal_handler()) < 0) { @@ -1490,7 +1471,7 @@ int main(int argc, char **argv) ret = daemon(0, 0); if (ret < 0) { PERROR("daemon"); - goto error; + goto exit; } } @@ -1501,7 +1482,7 @@ int main(int argc, char **argv) if (control_uri->port < 1024 || data_uri->port < 1024) { ERR("Need to be root to use ports < 1024"); ret = -1; - goto error; + goto exit; } } @@ -1566,6 +1547,7 @@ exit: if (!ret) { exit(EXIT_SUCCESS); } + error: exit(EXIT_FAILURE); }