Mercurial > dovecot > core-2.2
changeset 21836:b74ab3872a80
lib-dict: Keep a linked list of all transactions in dict.
This helps debugging if a transaction is leaked.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Wed, 29 Mar 2017 13:27:32 +0300 |
parents | eff2e4b8aa24 |
children | 97e01a0ad4bc |
files | src/lib-dict/dict-private.h src/lib-dict/dict.c |
diffstat | 2 files changed, 8 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-dict/dict-private.h Wed Mar 29 16:15:36 2017 +0300 +++ b/src/lib-dict/dict-private.h Wed Mar 29 13:27:32 2017 +0300 @@ -50,6 +50,7 @@ struct dict_vfuncs v; unsigned int iter_count; unsigned int transaction_count; + struct dict_transaction_context *transactions; }; struct dict_iterate_context { @@ -64,6 +65,7 @@ struct dict_transaction_context { struct dict *dict; + struct dict_transaction_context *prev, *next; struct timespec timestamp;
--- a/src/lib-dict/dict.c Wed Mar 29 16:15:36 2017 +0300 +++ b/src/lib-dict/dict.c Wed Mar 29 13:27:32 2017 +0300 @@ -2,6 +2,7 @@ #include "lib.h" #include "array.h" +#include "llist.h" #include "str.h" #include "dict-sql.h" #include "dict-private.h" @@ -102,6 +103,7 @@ i_assert(dict->iter_count == 0); i_assert(dict->transaction_count == 0); + i_assert(dict->transactions == NULL); dict->v.deinit(dict); } @@ -242,6 +244,7 @@ passed as parameter, e.g. it can be dict-fail when transactions are not supported. */ ctx->dict->transaction_count++; + DLLIST_PREPEND(&ctx->dict->transactions, ctx); return ctx; } @@ -273,6 +276,7 @@ *_ctx = NULL; i_assert(ctx->dict->transaction_count > 0); ctx->dict->transaction_count--; + DLLIST_REMOVE(&ctx->dict->transactions, ctx); return ctx->dict->v.transaction_commit(ctx, FALSE, NULL, NULL); } @@ -285,6 +289,7 @@ *_ctx = NULL; i_assert(ctx->dict->transaction_count > 0); ctx->dict->transaction_count--; + DLLIST_REMOVE(&ctx->dict->transactions, ctx); ctx->dict->v.transaction_commit(ctx, TRUE, callback, context); } @@ -295,6 +300,7 @@ *_ctx = NULL; i_assert(ctx->dict->transaction_count > 0); ctx->dict->transaction_count--; + DLLIST_REMOVE(&ctx->dict->transactions, ctx); ctx->dict->v.transaction_rollback(ctx); }