From: David Goulet Date: Fri, 15 Jun 2012 15:00:11 +0000 (-0400) Subject: Add pipe creation to utils facility X-Git-Tag: v2.1.0-rc1~109 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=ef599319218f03ff160778e577cd8389a165f47c;p=lttng-tools.git Add pipe creation to utils facility Three new functions are added to create a pipe, create a pipe with CLOEXEC flag and close a pipe. Those functions are now used in the session daemon for all pipes and cleanup. Signed-off-by: David Goulet --- diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c index a9d538c7c..452b7ba7e 100644 --- a/src/bin/lttng-sessiond/main.c +++ b/src/bin/lttng-sessiond/main.c @@ -407,7 +407,7 @@ static void stop_threads(void) */ static void cleanup(void) { - int ret, i; + int ret; char *cmd; struct ltt_session *sess, *stmp; @@ -457,34 +457,9 @@ static void cleanup(void) DBG("Unloading kernel modules"); modprobe_remove_lttng_all(); } - - /* - * Closing all pipes used for communication between threads. - */ - for (i = 0; i < 2; i++) { - if (kernel_poll_pipe[i] >= 0) { - ret = close(kernel_poll_pipe[i]); - if (ret) { - PERROR("close"); - } - } - } - for (i = 0; i < 2; i++) { - if (thread_quit_pipe[i] >= 0) { - ret = close(thread_quit_pipe[i]); - if (ret) { - PERROR("close"); - } - } - } - for (i = 0; i < 2; i++) { - if (apps_cmd_pipe[i] >= 0) { - ret = close(apps_cmd_pipe[i]); - if (ret) { - PERROR("close"); - } - } - } + utils_close_pipe(kernel_poll_pipe); + utils_close_pipe(thread_quit_pipe); + utils_close_pipe(apps_cmd_pipe); /* */ DBG("%c[%d;%dm*** assert failed :-) *** ==> %c[%dm%c[%d;%dm" @@ -4167,58 +4142,6 @@ end: return ret; } -/* - * Create the pipe used to wake up the kernel thread. - * Closed in cleanup(). - */ -static int create_kernel_poll_pipe(void) -{ - int ret, i; - - ret = pipe(kernel_poll_pipe); - if (ret < 0) { - PERROR("kernel poll pipe"); - goto error; - } - - for (i = 0; i < 2; i++) { - ret = fcntl(kernel_poll_pipe[i], F_SETFD, FD_CLOEXEC); - if (ret < 0) { - PERROR("fcntl kernel_poll_pipe"); - goto error; - } - } - -error: - return ret; -} - -/* - * Create the application command pipe to wake thread_manage_apps. - * Closed in cleanup(). - */ -static int create_apps_cmd_pipe(void) -{ - int ret, i; - - ret = pipe(apps_cmd_pipe); - if (ret < 0) { - PERROR("apps cmd pipe"); - goto error; - } - - for (i = 0; i < 2; i++) { - ret = fcntl(apps_cmd_pipe[i], F_SETFD, FD_CLOEXEC); - if (ret < 0) { - PERROR("fcntl apps_cmd_pipe"); - goto error; - } - } - -error: - return ret; -} - /* * Create the lttng run directory needed for all global sockets and pipe. */ @@ -4617,12 +4540,12 @@ int main(int argc, char **argv) } /* Setup the kernel pipe for waking up the kernel thread */ - if ((ret = create_kernel_poll_pipe()) < 0) { + if ((ret = utils_create_pipe_cloexec(kernel_poll_pipe)) < 0) { goto exit; } /* Setup the thread apps communication pipe. */ - if ((ret = create_apps_cmd_pipe()) < 0) { + if ((ret = utils_create_pipe_cloexec(apps_cmd_pipe)) < 0) { goto exit; } diff --git a/src/bin/lttng-sessiond/utils.c b/src/bin/lttng-sessiond/utils.c index ce2e97561..d0c8dd16f 100644 --- a/src/bin/lttng-sessiond/utils.c +++ b/src/bin/lttng-sessiond/utils.c @@ -18,6 +18,7 @@ #define _GNU_SOURCE #include +#include #include #include #include @@ -52,3 +53,77 @@ const char *get_home_dir(void) { return ((const char *) getenv("HOME")); } + +/* + * Create a pipe in dst. + */ +int utils_create_pipe(int *dst) +{ + int ret; + + if (dst == NULL) { + return -1; + } + + ret = pipe(dst); + if (ret < 0) { + PERROR("create pipe"); + } + + return ret; +} + +/* + * Create pipe and set CLOEXEC flag to both fd. + * + * Make sure the pipe opened by this function are closed at some point. Use + * utils_close_pipe(). + */ +int utils_create_pipe_cloexec(int *dst) +{ + int ret, i; + + if (dst == NULL) { + return -1; + } + + ret = utils_create_pipe(dst); + if (ret < 0) { + goto error; + } + + for (i = 0; i < 2; i++) { + ret = fcntl(dst[i], F_SETFD, FD_CLOEXEC); + if (ret < 0) { + PERROR("fcntl pipe cloexec"); + goto error; + } + } + +error: + return ret; +} + +/* + * Close both read and write side of the pipe. + */ +void utils_close_pipe(int *src) +{ + int i, ret; + + if (src == NULL) { + return; + } + + for (i = 0; i < 2; i++) { + /* Safety check */ + if (src[i] < 0) { + continue; + } + + ret = close(src[i]); + if (ret) { + PERROR("close pipe"); + } + } +} diff --git a/src/bin/lttng-sessiond/utils.h b/src/bin/lttng-sessiond/utils.h index d4bd8c286..a63d0a3dc 100644 --- a/src/bin/lttng-sessiond/utils.h +++ b/src/bin/lttng-sessiond/utils.h @@ -20,5 +20,8 @@ const char *get_home_dir(void); int notify_thread_pipe(int wpipe); +int utils_create_pipe_cloexec(int *dst); +int utils_create_pipe(int *dst); +void utils_close_pipe(int *src); #endif /* _LTT_UTILS_H */