]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: When logging I/O or timeout leak, log also raw backtrace
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 8 Aug 2017 17:07:18 +0000 (20:07 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Wed, 27 Sep 2017 07:35:54 +0000 (10:35 +0300)
This can be useful when trying to figure out where the io_loop_destroy() was
called from.

src/lib/ioloop.c

index 89c0e98714dd93b118ef72e8078f257accd68938..0eb2c62a0ceaaf6afc703e1b82c65b03d22f0388 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "lib.h"
 #include "array.h"
+#include "backtrace-string.h"
 #include "llist.h"
 #include "time-util.h"
 #include "istream-private.h"
@@ -703,6 +704,7 @@ void io_loop_destroy(struct ioloop **_ioloop)
        struct ioloop *ioloop = *_ioloop;
        struct timeout *const *to_idx;
        struct priorityq_item *item;
+       bool leaks = FALSE;
 
        *_ioloop = NULL;
 
@@ -722,6 +724,7 @@ void io_loop_destroy(struct ioloop **_ioloop)
                          io->io.source_filename,
                          io->io.source_linenum, io->fd);
                io_remove(&_io);
+               leaks = TRUE;
        }
        i_assert(ioloop->io_pending_count == 0);
 
@@ -732,6 +735,7 @@ void io_loop_destroy(struct ioloop **_ioloop)
                          to->source_filename,
                          to->source_linenum);
                timeout_free(to);
+               leaks = TRUE;
        }
        array_free(&ioloop->timeouts_new);
 
@@ -742,6 +746,7 @@ void io_loop_destroy(struct ioloop **_ioloop)
                          to->source_filename,
                          to->source_linenum);
                timeout_free(to);
+               leaks = TRUE;
        }
        priorityq_deinit(&ioloop->timeouts);
 
@@ -752,6 +757,13 @@ void io_loop_destroy(struct ioloop **_ioloop)
                          timer->source_filename,
                          timer->source_linenum);
                io_wait_timer_remove(&timer);
+               leaks = TRUE;
+       }
+
+       if (leaks) {
+               const char *backtrace;
+               if (backtrace_get(&backtrace) == 0)
+                       i_warning("Raw backtrace for leaks: %s", backtrace);
        }
 
        if (ioloop->handler_context != NULL)