diff --git a/src/lib-dict-extra/dict-fs.c b/src/lib-dict-extra/dict-fs.c index 82ea827308..bf1595f92c 100644 --- a/src/lib-dict-extra/dict-fs.c +++ b/src/lib-dict-extra/dict-fs.c @@ -258,7 +258,7 @@ static int fs_dict_write_changes(struct dict_transaction_memory_context *ctx) return 0; } -static int +static void fs_dict_transaction_commit(struct dict_transaction_context *_ctx, bool async ATTR_UNUSED, dict_transaction_commit_callback_t *callback, @@ -274,9 +274,7 @@ fs_dict_transaction_commit(struct dict_transaction_context *_ctx, ret = 1; pool_unref(&ctx->pool); - if (callback != NULL) - callback(ret, context); - return ret; + callback(ret, context); } struct dict dict_driver_fs = { diff --git a/src/lib-dict/dict-client.c b/src/lib-dict/dict-client.c index 40378c6016..bf9a370c2d 100644 --- a/src/lib-dict/dict-client.c +++ b/src/lib-dict/dict-client.c @@ -768,7 +768,7 @@ static void dict_async_input(struct client_dict *dict) } } -static int +static void client_dict_transaction_commit(struct dict_transaction_context *_ctx, bool async, dict_transaction_commit_callback_t *callback, @@ -799,6 +799,7 @@ client_dict_transaction_commit(struct dict_transaction_context *_ctx, dict->io = io_add(dict->fd, IO_READ, dict_async_input, dict); } + return; } else { /* sync commit, read reply */ if (client_dict_read_line(dict, &line, &error) < 0) { @@ -830,14 +831,12 @@ client_dict_transaction_commit(struct dict_transaction_context *_ctx, } } } + DLLIST_REMOVE(&dict->transactions, ctx); - if (ret < 0 || !async) { - DLLIST_REMOVE(&dict->transactions, ctx); - i_free(ctx); + callback(ret, context); + i_free(ctx); - client_dict_add_timeout(dict); - } - return ret; + client_dict_add_timeout(dict); } static void diff --git a/src/lib-dict/dict-file.c b/src/lib-dict/dict-file.c index 856453c625..615d2935eb 100644 --- a/src/lib-dict/dict-file.c +++ b/src/lib-dict/dict-file.c @@ -623,7 +623,7 @@ static int file_dict_write_changes(struct dict_transaction_memory_context *ctx, return 0; } -static int +static void file_dict_transaction_commit(struct dict_transaction_context *_ctx, bool async ATTR_UNUSED, dict_transaction_commit_callback_t *callback, @@ -642,9 +642,7 @@ file_dict_transaction_commit(struct dict_transaction_context *_ctx, ret = 1; pool_unref(&ctx->pool); - if (callback != NULL) - callback(ret, context); - return ret; + callback(ret, context); } struct dict dict_driver_file = { diff --git a/src/lib-dict/dict-memcached-ascii.c b/src/lib-dict/dict-memcached-ascii.c index 1bcaa02d5f..3d1e4571a1 100644 --- a/src/lib-dict/dict-memcached-ascii.c +++ b/src/lib-dict/dict-memcached-ascii.c @@ -610,7 +610,7 @@ memcached_ascii_transaction_send(struct dict_memcached_ascii_commit_ctx *ctx) return 0; } -static int +static void memcached_ascii_transaction_commit(struct dict_transaction_context *_ctx, bool async, dict_transaction_commit_callback_t *callback, @@ -637,7 +637,7 @@ memcached_ascii_transaction_commit(struct dict_transaction_context *_ctx, if (async && ret == 0) { pool_unref(&ctx->pool); - return 1; + return; } if (ret == 0) { @@ -647,10 +647,8 @@ memcached_ascii_transaction_commit(struct dict_transaction_context *_ctx, } } } - if (callback != NULL) - callback(ret, context); + callback(ret, context); pool_unref(&ctx->pool); - return ret; } struct dict dict_driver_memcached_ascii = { diff --git a/src/lib-dict/dict-private.h b/src/lib-dict/dict-private.h index 16893e8ac4..049588d4da 100644 --- a/src/lib-dict/dict-private.h +++ b/src/lib-dict/dict-private.h @@ -23,10 +23,11 @@ struct dict_vfuncs { const char **error_r); struct dict_transaction_context *(*transaction_init)(struct dict *dict); - int (*transaction_commit)(struct dict_transaction_context *ctx, - bool async, - dict_transaction_commit_callback_t *callback, - void *context); + /* call the callback before returning if non-async commits */ + void (*transaction_commit)(struct dict_transaction_context *ctx, + bool async, + dict_transaction_commit_callback_t *callback, + void *context); void (*transaction_rollback)(struct dict_transaction_context *ctx); void (*set)(struct dict_transaction_context *ctx, diff --git a/src/lib-dict/dict-redis.c b/src/lib-dict/dict-redis.c index 5d16474898..2d38eb59c3 100644 --- a/src/lib-dict/dict-redis.c +++ b/src/lib-dict/dict-redis.c @@ -577,7 +577,7 @@ redis_transaction_init(struct dict *_dict) return &ctx->ctx; } -static int +static void redis_transaction_commit(struct dict_transaction_context *_ctx, bool async, dict_transaction_commit_callback_t *callback, void *context) @@ -610,14 +610,12 @@ redis_transaction_commit(struct dict_transaction_context *_ctx, bool async, redis_input_state_add(dict, REDIS_INPUT_STATE_EXEC_REPLY); if (async) { i_free(ctx); - return 1; + return; } redis_wait(dict); } - if (callback != NULL) - callback(ret, context); + callback(ret, context); i_free(ctx); - return ret; } static void redis_transaction_rollback(struct dict_transaction_context *_ctx) diff --git a/src/lib-dict/dict-sql.c b/src/lib-dict/dict-sql.c index dcaea55ee1..2ba4179165 100644 --- a/src/lib-dict/dict-sql.c +++ b/src/lib-dict/dict-sql.c @@ -798,7 +798,7 @@ sql_dict_transaction_commit_callback(const char *error, sql_dict_transaction_free(ctx); } -static int +static void sql_dict_transaction_commit(struct dict_transaction_context *_ctx, bool async, dict_transaction_commit_callback_t *callback, void *context) @@ -822,7 +822,7 @@ sql_dict_transaction_commit(struct dict_transaction_context *_ctx, bool async, ctx->async_context = context; sql_transaction_commit(&ctx->sql_ctx, sql_dict_transaction_commit_callback, ctx); - return 1; + return; } else { if (sql_transaction_commit_s(&ctx->sql_ctx, &error) < 0) { i_error("sql dict: commit failed: %s", error); @@ -834,9 +834,7 @@ sql_dict_transaction_commit(struct dict_transaction_context *_ctx, bool async, } sql_dict_transaction_free(ctx); - if (callback != NULL) - callback(ret, context); - return ret; + callback(ret, context); } static void sql_dict_transaction_rollback(struct dict_transaction_context *_ctx) diff --git a/src/lib-dict/dict.c b/src/lib-dict/dict.c index e8c4123650..e2ddff2e49 100644 --- a/src/lib-dict/dict.c +++ b/src/lib-dict/dict.c @@ -187,12 +187,21 @@ struct dict_transaction_context *dict_transaction_begin(struct dict *dict) return dict->v.transaction_init(dict); } +static void dict_transaction_commit_sync_callback(int ret, void *context) +{ + int *ret_p = context; + *ret_p = ret; +} + int dict_transaction_commit(struct dict_transaction_context **_ctx) { struct dict_transaction_context *ctx = *_ctx; + int ret; *_ctx = NULL; - return ctx->dict->v.transaction_commit(ctx, FALSE, NULL, NULL); + ctx->dict->v.transaction_commit(ctx, FALSE, + dict_transaction_commit_sync_callback, &ret); + return ret; } void dict_transaction_commit_async(struct dict_transaction_context **_ctx,