Add pipe creation to utils facility
authorDavid Goulet <dgoulet@efficios.com>
Fri, 15 Jun 2012 15:00:11 +0000 (11:00 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Fri, 15 Jun 2012 15:00:11 +0000 (11:00 -0400)
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 <dgoulet@efficios.com>
src/bin/lttng-sessiond/main.c
src/bin/lttng-sessiond/utils.c
src/bin/lttng-sessiond/utils.h

index a9d538c7cd4b5e201bfafc29981e49409cf5081c..452b7ba7eff94e1254775a12ae7f99d4add40108 100644 (file)
@@ -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);
 
        /* <fun> */
        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;
        }
 
index ce2e97561f0170c3dbdb072370e79b1e5ec502ae..d0c8dd16f62571618db8118759d7a8ee4e650a76 100644 (file)
@@ -18,6 +18,7 @@
 
 #define _GNU_SOURCE
 #include <errno.h>
+#include <fcntl.h>
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -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");
+               }
+       }
+}
index d4bd8c286f9df4b0f577029677d2a92d150a5f13..a63d0a3dc5458f538cdb75a18987760bc578400c 100644 (file)
@@ -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 */
This page took 0.030249 seconds and 4 git commands to generate.