From: Timo Sirainen Date: Wed, 15 Jan 2014 20:11:22 +0000 (+0200) Subject: lib-index: Keep track of views and transactions in linked lists. X-Git-Tag: 2.2.11~33 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ef4d0eafab4d26bba047551db1e23ceff8aa9404;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Keep track of views and transactions in linked lists. This makes debugging easier. --- diff --git a/src/lib-index/mail-index-private.h b/src/lib-index/mail-index-private.h index 0e3122cf9a..8910329692 100644 --- a/src/lib-index/mail-index-private.h +++ b/src/lib-index/mail-index-private.h @@ -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; diff --git a/src/lib-index/mail-index-transaction-private.h b/src/lib-index/mail-index-transaction-private.h index f4fc880515..421c7ff6ba 100644 --- a/src/lib-index/mail-index-transaction-private.h +++ b/src/lib-index/mail-index-transaction-private.h @@ -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; diff --git a/src/lib-index/mail-index-transaction.c b/src/lib-index/mail-index-transaction.c index e2de7a1926..25b1fe4cb8 100644 --- a/src/lib-index/mail-index-transaction.c +++ b/src/lib-index/mail-index-transaction.c @@ -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); diff --git a/src/lib-index/mail-index-view-private.h b/src/lib-index/mail-index-view-private.h index d9d26ac295..3c323fde81 100644 --- a/src/lib-index/mail-index-view-private.h +++ b/src/lib-index/mail-index-view-private.h @@ -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; diff --git a/src/lib-index/mail-index-view.c b/src/lib-index/mail-index-view.c index 289adefb7d..28f721f554 100644 --- a/src/lib-index/mail-index-view.c +++ b/src/lib-index/mail-index-view.c @@ -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; } diff --git a/src/lib-index/mail-index.c b/src/lib-index/mail-index.c index 2cec7f3a89..16705cf4aa 100644 --- a/src/lib-index/mail-index.c +++ b/src/lib-index/mail-index.c @@ -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);