Skip to content

Commit

Permalink
lib-dict: Track transaction counts
Browse files Browse the repository at this point in the history
  • Loading branch information
cmouse authored and GitLab committed Mar 23, 2017
1 parent d42321a commit f32da6b
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 2 deletions.
1 change: 1 addition & 0 deletions src/lib-dict/dict-private.h
Expand Up @@ -50,6 +50,7 @@ struct dict {

struct dict_vfuncs v;
unsigned int iter_count;
unsigned int transaction_count;
};

struct dict_iterate_context {
Expand Down
17 changes: 15 additions & 2 deletions src/lib-dict/dict.c
Expand Up @@ -222,9 +222,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)
Expand Down Expand Up @@ -272,6 +279,8 @@ int dict_transaction_commit(struct dict_transaction_context **_ctx,
*_ctx = NULL;

i_zero(&result);
i_assert(ctx->dict->transaction_count > 0);
ctx->dict->transaction_count--;
ctx->dict->v.transaction_commit(ctx, FALSE,
dict_transaction_commit_sync_callback, &result);
*error_r = t_strdup(result.error);
Expand All @@ -286,6 +295,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--;
if (callback == NULL)
callback = dict_transaction_commit_async_noop_callback;
ctx->dict->v.transaction_commit(ctx, TRUE, callback, context);
Expand All @@ -296,6 +307,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);
}

Expand Down

0 comments on commit f32da6b

Please sign in to comment.