]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-dict: Keep a linked list of all transactions in dict.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 29 Mar 2017 10:27:32 +0000 (13:27 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 30 Mar 2017 17:54:47 +0000 (20:54 +0300)
This helps debugging if a transaction is leaked.

src/lib-dict/dict-private.h
src/lib-dict/dict.c

index 1c2a2fd204c014274245261503d9e3704b358095..c89baae84c8b2ff57532d4b43132123f47158743 100644 (file)
@@ -50,6 +50,7 @@ struct dict {
        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_iterate_context {
 
 struct dict_transaction_context {
        struct dict *dict;
+       struct dict_transaction_context *prev, *next;
 
        struct timespec timestamp;
 
index 1895528787e8e3a6a54a912f98afe3adb39beb77..a3a3840ee31894769dc212e514602001ddde6ecb 100644 (file)
@@ -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 @@ void dict_deinit(struct dict **_dict)
 
        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 @@ struct dict_transaction_context *dict_transaction_begin(struct dict *dict)
           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 @@ int dict_transaction_commit(struct dict_transaction_context **_ctx)
        *_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 @@ void dict_transaction_commit_async(struct dict_transaction_context **_ctx,
        *_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 @@ void dict_transaction_rollback(struct dict_transaction_context **_ctx)
        *_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);
 }