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;
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 *
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)
/* 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. */