changeset 21801:62499b1abc68

lib-dict: Track transaction counts
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Wed, 22 Mar 2017 12:01:07 +0200
parents a1ebd140977c
children 246f9b9c41b3
files src/lib-dict/dict-private.h src/lib-dict/dict.c
diffstat 2 files changed, 16 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-dict/dict-private.h	Wed Mar 22 10:33:20 2017 +0200
+++ b/src/lib-dict/dict-private.h	Wed Mar 22 12:01:07 2017 +0200
@@ -49,6 +49,7 @@
 
 	struct dict_vfuncs v;
 	unsigned int iter_count;
+	unsigned int transaction_count;
 };
 
 struct dict_iterate_context {
--- a/src/lib-dict/dict.c	Wed Mar 22 10:33:20 2017 +0200
+++ b/src/lib-dict/dict.c	Wed Mar 22 12:01:07 2017 +0200
@@ -229,9 +229,16 @@
 
 struct dict_transaction_context *dict_transaction_begin(struct dict *dict)
 {
+	struct dict_transaction_context *ctx;
 	if (dict->v.transaction_init == NULL)
-		return &dict_transaction_unsupported;
-	return dict->v.transaction_init(dict);
+		ctx = &dict_transaction_unsupported;
+	else
+		ctx = dict->v.transaction_init(dict);
+	/* the dict in context can differ from the dict
+	   passed as parameter, e.g. it can be dict-fail when
+	   transactions are not supported. */
+	ctx->dict->transaction_count++;
+	return ctx;
 }
 
 void dict_transaction_no_slowness_warning(struct dict_transaction_context *ctx)
@@ -260,6 +267,8 @@
 	struct dict_transaction_context *ctx = *_ctx;
 
 	*_ctx = NULL;
+	i_assert(ctx->dict->transaction_count > 0);
+	ctx->dict->transaction_count--;
 	return ctx->dict->v.transaction_commit(ctx, FALSE, NULL, NULL);
 }
 
@@ -270,6 +279,8 @@
 	struct dict_transaction_context *ctx = *_ctx;
 
 	*_ctx = NULL;
+	i_assert(ctx->dict->transaction_count > 0);
+	ctx->dict->transaction_count--;
 	ctx->dict->v.transaction_commit(ctx, TRUE, callback, context);
 }
 
@@ -278,6 +289,8 @@
 	struct dict_transaction_context *ctx = *_ctx;
 
 	*_ctx = NULL;
+	i_assert(ctx->dict->transaction_count > 0);
+	ctx->dict->transaction_count--;
 	ctx->dict->v.transaction_rollback(ctx);
 }