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);
 }