]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-dict: Track transaction counts
authorAki Tuomi <aki.tuomi@dovecot.fi>
Wed, 22 Mar 2017 10:01:07 +0000 (12:01 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 27 Mar 2017 09:52:14 +0000 (12:52 +0300)
src/lib-dict/dict-private.h
src/lib-dict/dict.c

index 70a0e390e22ee8c70281211459111fe15848555c..1c2a2fd204c014274245261503d9e3704b358095 100644 (file)
@@ -49,6 +49,7 @@ struct dict {
 
        struct dict_vfuncs v;
        unsigned int iter_count;
+       unsigned int transaction_count;
 };
 
 struct dict_iterate_context {
index 3f5f641c20040deee185f537799a9e5e54e24c30..df452a1151772380577876ecd000764bd740ae95 100644 (file)
@@ -229,9 +229,16 @@ int dict_iterate_deinit(struct dict_iterate_context **_ctx)
 
 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 @@ int dict_transaction_commit(struct dict_transaction_context **_ctx)
        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 @@ void dict_transaction_commit_async(struct dict_transaction_context **_ctx,
        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 @@ void dict_transaction_rollback(struct dict_transaction_context **_ctx)
        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);
 }