relayd: track stdio output file descriptors
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Wed, 27 Nov 2019 05:32:24 +0000 (00:32 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 30 Jan 2020 06:55:34 +0000 (01:55 -0500)
Track the stdout and stderr file descriptors through the fd
tracker. These file descriptors are considered unsuspendable
since they can't be re-opened.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: Ibd80fb1ba1b21ee152bae6047a5dd176d1d2c051

src/bin/lttng-relayd/main.c

index 6318f8308f10ba059af1a3f886bff46a274ad93c..16bfccbfa0c982cd3c7fcd33c0ed1ea0999369cf 100644 (file)
@@ -677,6 +677,11 @@ static void relayd_cleanup(void)
                                sessiond_trace_chunk_registry);
        }
        if (the_fd_tracker) {
+               untrack_stdio();
+               /*
+                * fd_tracker_destroy() will log the contents of the fd-tracker
+                * if a leak is detected.
+                */
                fd_tracker_destroy(the_fd_tracker);
        }
 
@@ -687,7 +692,6 @@ static void relayd_cleanup(void)
        if (tracing_group_name_override) {
                free((void *) tracing_group_name);
        }
-       fd_tracker_log(the_fd_tracker);
 }
 
 /*
@@ -3987,6 +3991,39 @@ static int create_relay_conn_pipe(void)
                        "Relayd connection pipe", relay_conn_pipe);
 }
 
+static int stdio_open(void *data, int *fds)
+{
+       fds[0] = fileno(stdout);
+       fds[1] = fileno(stderr);
+       return 0;
+}
+
+static int noop_close(void *data, int *fds)
+{
+       return 0;
+}
+
+static int track_stdio(void)
+{
+       int fds[2];
+       const char *names[] = { "stdout", "stderr" };
+
+       return fd_tracker_open_unsuspendable_fd(the_fd_tracker, fds,
+                       names, 2, stdio_open, NULL);
+}
+
+static void untrack_stdio(void)
+{
+       int fds[] = { fileno(stdout), fileno(stderr) };
+
+       /*
+        * noop_close is used since we don't really want to close
+        * the stdio output fds; we merely want to stop tracking them.
+        */
+       (void) fd_tracker_close_unsuspendable_fd(the_fd_tracker,
+                       fds, 2, noop_close, NULL);
+}
+
 /*
  * main
  */
@@ -4091,6 +4128,12 @@ int main(int argc, char **argv)
                goto exit_options;
        }
 
+       ret = track_stdio();
+       if (ret) {
+               retval = -1;
+               goto exit_options;
+       }
+
        /* Initialize thread health monitoring */
        health_relayd = health_app_create(NR_HEALTH_RELAYD_TYPES);
        if (!health_relayd) {
This page took 0.027367 seconds and 4 git commands to generate.