Backport: relayd: track stdio output fds
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 28 Jun 2018 03:16:44 +0000 (23:16 -0400)
committerJonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Fri, 21 Sep 2018 04:00:52 +0000 (00:00 -0400)
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-relayd/main.c

index f5bb9409f29d56bcd68fea31033baed1df3b2aa8..36dfc7fb4b88eeee96741178a2d72b87fcfcf720 100644 (file)
@@ -630,7 +630,6 @@ static void relayd_cleanup(void)
        if (tracing_group_name_override) {
                free((void *) tracing_group_name);
        }
-       fd_tracker_log(the_fd_tracker);
 }
 
 /*
@@ -3248,6 +3247,43 @@ 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
  */
@@ -3335,6 +3371,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) {
@@ -3497,6 +3539,11 @@ exit_options:
        /* Ensure all prior call_rcu are done. */
        rcu_barrier();
 
+       untrack_stdio();
+       /*
+        * fd_tracker_destroy() will log the contents of the fd-tracker
+        * if a leak is detected.
+        */
        fd_tracker_destroy(the_fd_tracker);
        rcu_unregister_thread();
 
This page took 0.02884 seconds and 5 git commands to generate.