]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: If mail_index_view is leaked, include in Panic the file:line where it...
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 13 Sep 2017 15:32:23 +0000 (18:32 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 13 Sep 2017 15:32:23 +0000 (18:32 +0300)
src/lib-index/mail-index-view-private.h
src/lib-index/mail-index-view.c
src/lib-index/mail-index.c
src/lib-index/mail-index.h

index e291fae1a5aedb712690a33a2a4e9cedda12376c..ed059934b872ea89cd94545859b6cfbac11deb06 100644 (file)
@@ -51,6 +51,9 @@ struct mail_index_view {
        struct mail_index *index;
         struct mail_transaction_log_view *log_view;
 
+       const char *source_filename;
+       unsigned int source_linenum;
+
        uint32_t indexid;
        unsigned int inconsistency_id;
        uint64_t highest_modseq;
index 7b4ff19f7eb519dce9d4ce2fcaeebf87262ae272..aacc5980c0ace3d73c1b78fd8cc6e1c126772aca 100644 (file)
@@ -630,9 +630,18 @@ mail_index_view_open_with_map(struct mail_index *index,
        return view;
 }
 
-struct mail_index_view *mail_index_view_open(struct mail_index *index)
+#undef mail_index_view_open
+struct mail_index_view *
+mail_index_view_open(struct mail_index *index,
+                    const char *source_filename, unsigned int source_linenum)
 {
-       return mail_index_view_open_with_map(index, index->map);
+       struct mail_index_view *view;
+
+       view = mail_index_view_open_with_map(index, index->map);
+       /* these can be used to debug mail_index_view_close() leaks */
+       view->source_filename = source_filename;
+       view->source_linenum = source_linenum;
+       return view;
 }
 
 const struct mail_index_ext *
index 4ab64aeb36ed4c7abf03c4fc8e062aa709c5c7a6..84042b753e9bba1b0ec6b3119576f7886c1bd331 100644 (file)
@@ -693,6 +693,12 @@ void mail_index_close_file(struct mail_index *index)
 static void mail_index_close_nonopened(struct mail_index *index)
 {
        i_assert(!index->syncing);
+
+       if (index->views != NULL) {
+               i_panic("Leaked view for index %s: Opened in %s:%u",
+                       index->filepath, index->views->source_filename,
+                       index->views->source_linenum);
+       }
        i_assert(index->views == NULL);
 
        if (index->map != NULL)
index 87e002879d5da94598e0dabea9b5e0046481f082..687e051b138bc3fa055e874fa6f997d518472ac9 100644 (file)
@@ -301,7 +301,11 @@ mail_index_refresh(struct mail_index *index);
 /* View can be used to look into index. Sequence numbers inside view change
    only when you synchronize it. The view acquires required locks
    automatically, but you'll have to drop them manually. */
-struct mail_index_view *mail_index_view_open(struct mail_index *index);
+struct mail_index_view *
+mail_index_view_open(struct mail_index *index,
+                    const char *source_filename, unsigned int source_linenum);
+#define mail_index_view_open(index) \
+       mail_index_view_open(index, __FILE__, __LINE__)
 void mail_index_view_close(struct mail_index_view **view);
 
 /* Returns the index for given view. */