]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Keep track of views and transactions in linked lists.
authorTimo Sirainen <tss@iki.fi>
Wed, 15 Jan 2014 20:11:22 +0000 (22:11 +0200)
committerTimo Sirainen <tss@iki.fi>
Wed, 15 Jan 2014 20:11:22 +0000 (22:11 +0200)
This makes debugging easier.

src/lib-index/mail-index-private.h
src/lib-index/mail-index-transaction-private.h
src/lib-index/mail-index-transaction.c
src/lib-index/mail-index-view-private.h
src/lib-index/mail-index-view.c
src/lib-index/mail-index.c

index 0e3122cf9a65d0d6c349df18c821a44bad13be1f..8910329692f2aa0aaf758f657400ecedc6d546fe 100644 (file)
@@ -214,7 +214,7 @@ struct mail_index {
        uint32_t keywords_ext_id;
        uint32_t modseq_ext_id;
 
-       unsigned int view_count;
+       struct mail_index_view *views;
 
        /* Module-specific contexts. */
        ARRAY(union mail_index_module_context *) module_contexts;
index f4fc880515aaa436db3cd4a78bcd63a40cde4cd7..421c7ff6ba6412b6631e81f07b3395ee8fa21da6 100644 (file)
@@ -36,6 +36,7 @@ struct mail_index_flag_update {
 };
 
 struct mail_index_transaction {
+       struct mail_index_transaction *prev, *next;
        int refcount;
 
        enum mail_index_transaction_flags flags;
index e2de7a192699b17bf7fd66337311282de3b5a0a8..25b1fe4cb84da07dcab97020ade32f1d8eb2d174 100644 (file)
@@ -4,6 +4,7 @@
 #include "ioloop.h"
 #include "array.h"
 #include "bsearch-insert-pos.h"
+#include "llist.h"
 #include "mail-index-private.h"
 #include "mail-transaction-log-private.h"
 #include "mail-index-transaction-private.h"
@@ -50,6 +51,7 @@ void mail_index_transaction_unref(struct mail_index_transaction **_t)
 
        mail_index_transaction_reset_v(t);
 
+       DLLIST_REMOVE(&t->view->transactions_list, t);
        array_free(&t->module_contexts);
        mail_index_view_transaction_unref(t->view);
        if (t->latest_view != NULL)
@@ -311,6 +313,7 @@ mail_index_transaction_begin(struct mail_index_view *view,
 
        i_array_init(&t->module_contexts,
                     I_MIN(5, mail_index_module_register.id));
+       DLLIST_PREPEND(&view->transactions_list, t);
 
        if (hook_mail_index_transaction_created != NULL)
                hook_mail_index_transaction_created(t);
index d9d26ac29549a7108f9459644fa6ec8f79a305ca..3c323fde81676b2c52104ca2314fac9be5fb11f2 100644 (file)
@@ -44,6 +44,7 @@ union mail_index_view_module_context {
 };
 
 struct mail_index_view {
+       struct mail_index_view *prev, *next;
        int refcount;
 
        struct mail_index_view_vfuncs v;
@@ -69,6 +70,7 @@ struct mail_index_view {
        /* Module-specific contexts. */
        ARRAY(union mail_index_view_module_context *) module_contexts;
 
+       struct mail_index_transaction *transactions_list;
        int transactions;
 
        unsigned int inconsistent:1;
index 289adefb7d7a2d497125b156db6d216ab9829a21..28f721f55473d0e74a9cfa4b88a6bc3b48da5d21 100644 (file)
@@ -3,6 +3,7 @@
 #include "lib.h"
 #include "array.h"
 #include "buffer.h"
+#include "llist.h"
 #include "mail-index-view-private.h"
 #include "mail-transaction-log.h"
 
@@ -47,7 +48,7 @@ void mail_index_view_clone(struct mail_index_view *dest,
        i_array_init(&dest->module_contexts,
                     I_MIN(5, mail_index_module_register.id));
 
-       dest->index->view_count++;
+       DLLIST_PREPEND(&dest->index->views, dest);
 }
 
 void mail_index_view_ref(struct mail_index_view *view)
@@ -58,9 +59,9 @@ void mail_index_view_ref(struct mail_index_view *view)
 static void view_close(struct mail_index_view *view)
 {
        i_assert(view->refcount == 0);
-       i_assert(view->index->view_count > 0);
+       i_assert(view->index->views != NULL);
 
-       view->index->view_count--;
+       DLLIST_REMOVE(&view->index->views, view);
 
        mail_transaction_log_view_close(&view->log_view);
 
@@ -626,8 +627,7 @@ mail_index_view_open_with_map(struct mail_index *index,
 
        i_array_init(&view->module_contexts,
                     I_MIN(5, mail_index_module_register.id));
-
-       index->view_count++;
+       DLLIST_PREPEND(&index->views, view);
        return view;
 }
 
index 2cec7f3a896a6264bca179a08b61414e5834258e..16705cf4aa59f232869be9db003f6f037c21c642 100644 (file)
@@ -636,7 +636,7 @@ void mail_index_close(struct mail_index *index)
                return;
 
        i_assert(!index->syncing);
-       i_assert(index->view_count == 0);
+       i_assert(index->views == NULL);
 
        if (index->map != NULL)
                mail_index_unmap(&index->map);