dovecot: mail_cache_transaction_commit()/rollback() API is now p...

dovecot at dovecot.org dovecot at dovecot.org
Sat Sep 22 14:13:46 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/5ad7a36ca8c3
changeset: 6455:5ad7a36ca8c3
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Sep 22 14:13:07 2007 +0300
description:
mail_cache_transaction_commit()/rollback() API is now public and takes a **
pointer. Don't break if transaction is committed/rollbacked multiple times
for a cache view.

diffstat:

5 files changed, 30 insertions(+), 28 deletions(-)
src/lib-index/mail-cache-private.h     |    3 ---
src/lib-index/mail-cache-transaction.c |   29 +++++++++++++++++++----------
src/lib-index/mail-cache.c             |    5 ++---
src/lib-index/mail-cache.h             |    3 +++
src/lib-index/mail-index-transaction.c |   18 ++++++------------

diffs (159 lines):

diff -r b5e6543b4385 -r 5ad7a36ca8c3 src/lib-index/mail-cache-private.h
--- a/src/lib-index/mail-cache-private.h	Sat Sep 22 13:55:36 2007 +0300
+++ b/src/lib-index/mail-cache-private.h	Sat Sep 22 14:13:07 2007 +0300
@@ -230,9 +230,6 @@ int mail_cache_lookup_iter_next(struct m
 int mail_cache_lookup_iter_next(struct mail_cache_lookup_iterate_ctx *ctx,
 				struct mail_cache_iterate_field *field_r);
 
-int mail_cache_transaction_commit(struct mail_cache_transaction_ctx *ctx);
-void mail_cache_transaction_rollback(struct mail_cache_transaction_ctx *ctx);
-
 int mail_cache_map(struct mail_cache *cache, size_t offset, size_t size);
 void mail_cache_file_close(struct mail_cache *cache);
 int mail_cache_reopen(struct mail_cache *cache);
diff -r b5e6543b4385 -r 5ad7a36ca8c3 src/lib-index/mail-cache-transaction.c
--- a/src/lib-index/mail-cache-transaction.c	Sat Sep 22 13:55:36 2007 +0300
+++ b/src/lib-index/mail-cache-transaction.c	Sat Sep 22 14:13:07 2007 +0300
@@ -89,11 +89,18 @@ static void mail_cache_transaction_reset
 	ctx->changes = FALSE;
 }
 
-static void mail_cache_transaction_free(struct mail_cache_transaction_ctx *ctx)
-{
+static void
+mail_cache_transaction_free(struct mail_cache_transaction_ctx **_ctx)
+{
+	struct mail_cache_transaction_ctx *ctx = *_ctx;
+
+	*_ctx = NULL;
+
+	ctx->trans->cache_trans_ctx = NULL;
 	ctx->view->transaction = NULL;
 	ctx->view->trans_seq1 = ctx->view->trans_seq2 = 0;
 
+	mail_index_view_close(&ctx->view->trans_view);
 	if (ctx->cache_data != NULL)
 		buffer_free(&ctx->cache_data);
 	if (array_is_created(&ctx->cache_data_seq))
@@ -603,18 +610,19 @@ mail_cache_transaction_switch_seq(struct
 	ctx->changes = TRUE;
 }
 
-int mail_cache_transaction_commit(struct mail_cache_transaction_ctx *ctx)
-{
+int mail_cache_transaction_commit(struct mail_cache_transaction_ctx **_ctx)
+{
+	struct mail_cache_transaction_ctx *ctx = *_ctx;
 	struct mail_cache *cache = ctx->cache;
 	int ret = 0;
 
 	if (!ctx->changes || MAIL_CACHE_IS_UNUSABLE(cache)) {
-		mail_cache_transaction_free(ctx);
+		mail_cache_transaction_free(_ctx);
 		return 0;
 	}
 
 	if (mail_cache_transaction_lock(ctx) <= 0) {
-		mail_cache_transaction_rollback(ctx);
+		mail_cache_transaction_rollback(_ctx);
 		return -1;
 	}
 
@@ -631,12 +639,13 @@ int mail_cache_transaction_commit(struct
 
 	if (mail_cache_unlock(cache) < 0)
 		ret = -1;
-	mail_cache_transaction_free(ctx);
+	mail_cache_transaction_free(_ctx);
 	return ret;
 }
 
-void mail_cache_transaction_rollback(struct mail_cache_transaction_ctx *ctx)
-{
+void mail_cache_transaction_rollback(struct mail_cache_transaction_ctx **_ctx)
+{
+	struct mail_cache_transaction_ctx *ctx = *_ctx;
 	struct mail_cache *cache = ctx->cache;
 	const struct mail_cache_reservation *reservations;
 	unsigned int count;
@@ -660,7 +669,7 @@ void mail_cache_transaction_rollback(str
 		}
 	}
 
-	mail_cache_transaction_free(ctx);
+	mail_cache_transaction_free(_ctx);
 }
 
 static int
diff -r b5e6543b4385 -r 5ad7a36ca8c3 src/lib-index/mail-cache.c
--- a/src/lib-index/mail-cache.c	Sat Sep 22 13:55:36 2007 +0300
+++ b/src/lib-index/mail-cache.c	Sat Sep 22 14:13:07 2007 +0300
@@ -612,11 +612,10 @@ mail_cache_view_open(struct mail_cache *
 
 void mail_cache_view_close(struct mail_cache_view *view)
 {
+	i_assert(view->trans_view == NULL);
+
 	if (view->cache->field_header_write_pending)
                 (void)mail_cache_header_fields_update(view->cache);
-
-	if (view->trans_view != NULL)
-		mail_index_view_close(&view->trans_view);
 
 	array_free(&view->looping_offsets);
 	buffer_free(&view->cached_exists_buf);
diff -r b5e6543b4385 -r 5ad7a36ca8c3 src/lib-index/mail-cache.h
--- a/src/lib-index/mail-cache.h	Sat Sep 22 13:55:36 2007 +0300
+++ b/src/lib-index/mail-cache.h	Sat Sep 22 14:13:07 2007 +0300
@@ -71,6 +71,9 @@ mail_cache_get_transaction(struct mail_c
 mail_cache_get_transaction(struct mail_cache_view *view,
 			   struct mail_index_transaction *t);
 
+int mail_cache_transaction_commit(struct mail_cache_transaction_ctx **ctx);
+void mail_cache_transaction_rollback(struct mail_cache_transaction_ctx **ctx);
+
 /* Add new field to given record. Updates are not allowed. Fixed size fields
    must be exactly the expected size. */
 void mail_cache_add(struct mail_cache_transaction_ctx *ctx, uint32_t seq,
diff -r b5e6543b4385 -r 5ad7a36ca8c3 src/lib-index/mail-index-transaction.c
--- a/src/lib-index/mail-index-transaction.c	Sat Sep 22 13:55:36 2007 +0300
+++ b/src/lib-index/mail-index-transaction.c	Sat Sep 22 14:13:07 2007 +0300
@@ -81,10 +81,8 @@ void mail_index_transaction_reset(struct
 	memset(t->pre_hdr_mask, 0, sizeof(t->pre_hdr_mask));
 	memset(t->post_hdr_mask, 0, sizeof(t->post_hdr_mask));
 
-	if (t->cache_trans_ctx != NULL) {
-		mail_cache_transaction_rollback(t->cache_trans_ctx);
-                t->cache_trans_ctx = NULL;
-	}
+	if (t->cache_trans_ctx != NULL)
+		mail_cache_transaction_rollback(&t->cache_trans_ctx);
 
 	t->appends_nonsorted = FALSE;
 	t->pre_hdr_changed = FALSE;
@@ -534,10 +532,8 @@ static int mail_index_transaction_commit
 	i_assert(t->first_new_seq >
 		 mail_index_view_get_messages_count(t->view));
 
-	if (t->cache_trans_ctx != NULL) {
-		mail_cache_transaction_commit(t->cache_trans_ctx);
-                t->cache_trans_ctx = NULL;
-	}
+	if (t->cache_trans_ctx != NULL)
+		mail_cache_transaction_commit(&t->cache_trans_ctx);
 
 	if (array_is_created(&t->appends)) {
 		mail_index_transaction_sort_appends(t);
@@ -557,10 +553,8 @@ static int mail_index_transaction_commit
 
 static void mail_index_transaction_rollback_v(struct mail_index_transaction *t)
 {
-	if (t->cache_trans_ctx != NULL) {
-		mail_cache_transaction_rollback(t->cache_trans_ctx);
-                t->cache_trans_ctx = NULL;
-	}
+	if (t->cache_trans_ctx != NULL)
+		mail_cache_transaction_rollback(&t->cache_trans_ctx);
         mail_index_transaction_unref(&t);
 }
 


More information about the dovecot-cvs mailing list