dovecot-2.0: Added reference counting to struct mail_keywords an...

dovecot at dovecot.org dovecot at dovecot.org
Tue Jun 23 00:58:33 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/094ad127d132
changeset: 9508:094ad127d132
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Jun 22 17:45:56 2009 -0400
description:
Added reference counting to struct mail_keywords and related APIs.

diffstat:

26 files changed, 100 insertions(+), 50 deletions(-)
src/imap/cmd-append.c                              |    2 -
src/imap/cmd-copy.c                                |    3 +-
src/imap/cmd-store.c                               |    2 -
src/lib-index/mail-index-sync.c                    |    4 +--
src/lib-index/mail-index-transaction.c             |   22 +++++++++++++---
src/lib-index/mail-index.h                         |    5 ++-
src/lib-lda/mail-deliver.c                         |    3 +-
src/lib-storage/index/cydir/cydir-storage.c        |    3 +-
src/lib-storage/index/dbox/dbox-storage.c          |    3 +-
src/lib-storage/index/dbox/dbox-sync-rebuild.c     |    4 +--
src/lib-storage/index/index-storage.c              |   11 ++++++--
src/lib-storage/index/index-storage.h              |    3 +-
src/lib-storage/index/maildir/maildir-storage.c    |    3 +-
src/lib-storage/index/maildir/maildir-sync-index.c |    8 +++---
src/lib-storage/index/mbox/mbox-storage.c          |    3 +-
src/lib-storage/index/mbox/mbox-sync.c             |    2 -
src/lib-storage/index/raw/raw-storage.c            |    3 +-
src/lib-storage/mail-search.c                      |    6 ++--
src/lib-storage/mail-storage-private.h             |    3 +-
src/lib-storage/mail-storage.c                     |   11 ++++++--
src/lib-storage/mail-storage.h                     |    5 ++-
src/lib-storage/test-mailbox.c                     |   26 ++++++++++++++------
src/plugins/convert/convert-storage.c              |    3 +-
src/plugins/lazy-expunge/lazy-expunge-plugin.c     |    3 +-
src/plugins/virtual/virtual-storage.c              |    3 +-
src/plugins/virtual/virtual-sync.c                 |    6 ++--

diffs (truncated from 518 to 300 lines):

diff -r d7e09c3eaace -r 094ad127d132 src/imap/cmd-append.c
--- a/src/imap/cmd-append.c	Mon Jun 22 01:44:42 2009 -0400
+++ b/src/imap/cmd-append.c	Mon Jun 22 17:45:56 2009 -0400
@@ -354,7 +354,7 @@ static bool cmd_append_continue_parsing(
 	ret = mailbox_save_begin(&ctx->save_ctx, ctx->input);
 
 	if (keywords != NULL)
-		mailbox_keywords_free(ctx->box, &keywords);
+		mailbox_keywords_unref(ctx->box, &keywords);
 
 	if (ret < 0) {
 		/* save initialization failed */
diff -r d7e09c3eaace -r 094ad127d132 src/imap/cmd-copy.c
--- a/src/imap/cmd-copy.c	Mon Jun 22 01:44:42 2009 -0400
+++ b/src/imap/cmd-copy.c	Mon Jun 22 17:45:56 2009 -0400
@@ -72,7 +72,8 @@ static int fetch_and_copy(struct client 
 
 		if (mailbox_copy(&save_ctx, mail) < 0)
 			ret = mail->expunged ? 0 : -1;
-		mailbox_keywords_free(destbox, &keywords);
+		if (keywords != NULL)
+			mailbox_keywords_unref(destbox, &keywords);
 
 		msgset_generator_next(&srcset_ctx, mail->uid);
 	}
diff -r d7e09c3eaace -r 094ad127d132 src/imap/cmd-store.c
--- a/src/imap/cmd-store.c	Mon Jun 22 01:44:42 2009 -0400
+++ b/src/imap/cmd-store.c	Mon Jun 22 17:45:56 2009 -0400
@@ -198,7 +198,7 @@ bool cmd_store(struct client_command_con
 	mail_free(&mail);
 
 	if (ctx.keywords != NULL)
-		mailbox_keywords_free(client->mailbox, &ctx.keywords);
+		mailbox_keywords_unref(client->mailbox, &ctx.keywords);
 
 	ret = mailbox_search_deinit(&search_ctx);
 	if (ret < 0)
diff -r d7e09c3eaace -r 094ad127d132 src/lib-index/mail-index-sync.c
--- a/src/lib-index/mail-index-sync.c	Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-index/mail-index-sync.c	Mon Jun 22 17:45:56 2009 -0400
@@ -89,7 +89,7 @@ static void mail_index_sync_add_keyword_
 		}
 	}
 
-	mail_index_keywords_free(&keywords);
+	mail_index_keywords_unref(&keywords);
 }
 
 static void mail_index_sync_add_keyword_reset(struct mail_index_sync_ctx *ctx)
@@ -106,7 +106,7 @@ static void mail_index_sync_add_keyword_
 						   MODIFY_REPLACE, keywords);
 		}
 	}
-	mail_index_keywords_free(&keywords);
+	mail_index_keywords_unref(&keywords);
 }
 
 static void mail_index_sync_add_append(struct mail_index_sync_ctx *ctx)
diff -r d7e09c3eaace -r 094ad127d132 src/lib-index/mail-index-transaction.c
--- a/src/lib-index/mail-index-transaction.c	Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-index/mail-index-transaction.c	Mon Jun 22 17:45:56 2009 -0400
@@ -1164,6 +1164,7 @@ mail_index_keywords_create(struct mail_i
 	if (count == 0) {
 		k = i_new(struct mail_keywords, 1);
 		k->index = index;
+		k->refcount = 1;
 		return k;
 	}
 
@@ -1171,6 +1172,7 @@ mail_index_keywords_create(struct mail_i
 	k = i_malloc(sizeof(struct mail_keywords) +
 		     (sizeof(k->idx) * (count-1)));
 	k->index = index;
+	k->refcount = 1;
 
 	/* look up the keywords from index. they're never removed from there
 	   so we can permanently store indexes to them. */
@@ -1202,6 +1204,7 @@ mail_index_keywords_create_from_indexes(
 	if (count == 0) {
 		k = i_new(struct mail_keywords, 1);
 		k->index = index;
+		k->refcount = 1;
 		return k;
 	}
 
@@ -1209,6 +1212,7 @@ mail_index_keywords_create_from_indexes(
 	k = i_malloc(sizeof(struct mail_keywords) +
 		     (sizeof(k->idx) * (count-1)));
 	k->index = index;
+	k->refcount = 1;
 
 	/* copy but skip duplicates */
 	for (src = dest = 0; src < count; src++) {
@@ -1223,10 +1227,20 @@ mail_index_keywords_create_from_indexes(
 	return k;
 }
 
-void mail_index_keywords_free(struct mail_keywords **keywords)
-{
-	i_free(*keywords);
-	*keywords = NULL;
+void mail_index_keywords_ref(struct mail_keywords *keywords)
+{
+	keywords->refcount++;
+}
+
+void mail_index_keywords_unref(struct mail_keywords **_keywords)
+{
+	struct mail_keywords *keywords = *_keywords;
+
+	i_assert(keywords->refcount > 0);
+
+	*_keywords = NULL;
+	if (--keywords->refcount == 0)
+		i_free(keywords);
 }
 
 static bool
diff -r d7e09c3eaace -r 094ad127d132 src/lib-index/mail-index.h
--- a/src/lib-index/mail-index.h	Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-index/mail-index.h	Mon Jun 22 17:45:56 2009 -0400
@@ -102,6 +102,7 @@ struct mail_keywords {
 struct mail_keywords {
 	struct mail_index *index;
 	unsigned int count;
+	int refcount;
 
         /* variable sized list of keyword indexes */
 	unsigned int idx[1];
@@ -430,8 +431,8 @@ mail_index_keywords_create_from_indexes(
 mail_index_keywords_create_from_indexes(struct mail_index *index,
 					const ARRAY_TYPE(keyword_indexes)
 						*keyword_indexes);
-/* Free the keywords. */
-void mail_index_keywords_free(struct mail_keywords **keywords);
+void mail_index_keywords_ref(struct mail_keywords *keywords);
+void mail_index_keywords_unref(struct mail_keywords **keywords);
 
 /* Update keywords for given message. */
 void mail_index_update_keywords(struct mail_index_transaction *t, uint32_t seq,
diff -r d7e09c3eaace -r 094ad127d132 src/lib-lda/mail-deliver.c
--- a/src/lib-lda/mail-deliver.c	Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-lda/mail-deliver.c	Mon Jun 22 17:45:56 2009 -0400
@@ -183,7 +183,8 @@ int mail_deliver_save(struct mail_delive
 	mailbox_save_set_flags(save_ctx, flags, kw);
 	if (mailbox_copy(&save_ctx, ctx->src_mail) < 0)
 		ret = -1;
-	mailbox_keywords_free(box, &kw);
+	if (kw != NULL)
+		mailbox_keywords_unref(box, &kw);
 
 	if (ret < 0)
 		mailbox_transaction_rollback(&t);
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/cydir/cydir-storage.c
--- a/src/lib-storage/index/cydir/cydir-storage.c	Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/cydir/cydir-storage.c	Mon Jun 22 17:45:56 2009 -0400
@@ -375,7 +375,8 @@ struct mailbox cydir_mailbox = {
 		index_transaction_set_max_modseq,
 		index_keywords_create,
 		index_keywords_create_from_indexes,
-		index_keywords_free,
+		index_keywords_ref,
+		index_keywords_unref,
 		index_keyword_is_valid,
 		index_storage_get_seq_range,
 		index_storage_get_uid_range,
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/dbox/dbox-storage.c
--- a/src/lib-storage/index/dbox/dbox-storage.c	Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-storage.c	Mon Jun 22 17:45:56 2009 -0400
@@ -878,7 +878,8 @@ struct mailbox dbox_mailbox = {
 		index_transaction_set_max_modseq,
 		index_keywords_create,
 		index_keywords_create_from_indexes,
-		index_keywords_free,
+		index_keywords_ref,
+		index_keywords_unref,
 		index_keyword_is_valid,
 		index_storage_get_seq_range,
 		index_storage_get_uid_range,
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/dbox/dbox-sync-rebuild.c
--- a/src/lib-storage/index/dbox/dbox-sync-rebuild.c	Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-sync-rebuild.c	Mon Jun 22 17:45:56 2009 -0400
@@ -104,7 +104,7 @@ dbox_sync_index_copy_from_old(struct dbo
 	mail_index_lookup_keywords(view, old_seq, &old_keywords);
 	kw = mail_index_keywords_create_from_indexes(index, &old_keywords);
 	mail_index_update_keywords(ctx->trans, new_seq, MODIFY_REPLACE, kw);
-	mail_index_keywords_free(&kw);
+	mail_index_keywords_unref(&kw);
 
 	dbox_sync_index_copy_cache(ctx, view, old_seq, new_seq);
 }
@@ -125,7 +125,7 @@ dbox_sync_index_copy_from_maildir(struct
 	keywords = mail_index_keywords_create_from_indexes(ctx->mbox->ibox.index,
 							   &keyword_indexes);
 	mail_index_update_keywords(ctx->trans, seq, MODIFY_REPLACE, keywords);
-	mail_index_keywords_free(&keywords);
+	mail_index_keywords_unref(&keywords);
 }
 
 void dbox_sync_rebuild_index_metadata(struct dbox_sync_rebuild_context *ctx,
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/index-storage.c
--- a/src/lib-storage/index/index-storage.c	Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/index-storage.c	Mon Jun 22 17:45:56 2009 -0400
@@ -644,9 +644,14 @@ index_keywords_create_from_indexes(struc
 	return mail_index_keywords_create_from_indexes(ibox->index, idx);
 }
 
-void index_keywords_free(struct mail_keywords *keywords)
-{
-	mail_index_keywords_free(&keywords);
+void index_keywords_ref(struct mail_keywords *keywords)
+{
+	mail_index_keywords_ref(keywords);
+}
+
+void index_keywords_unref(struct mail_keywords *keywords)
+{
+	mail_index_keywords_unref(&keywords);
 }
 
 void index_save_context_free(struct mail_save_context *ctx)
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/index-storage.h
--- a/src/lib-storage/index/index-storage.h	Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/index-storage.h	Mon Jun 22 17:45:56 2009 -0400
@@ -107,7 +107,8 @@ struct mail_keywords *
 struct mail_keywords *
 index_keywords_create_from_indexes(struct mailbox *box,
 				   const ARRAY_TYPE(keyword_indexes) *idx);
-void index_keywords_free(struct mail_keywords *keywords);
+void index_keywords_ref(struct mail_keywords *keywords);
+void index_keywords_unref(struct mail_keywords *keywords);
 bool index_keyword_is_valid(struct mailbox *box, const char *keyword,
 			    const char **error_r);
 
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/maildir/maildir-storage.c
--- a/src/lib-storage/index/maildir/maildir-storage.c	Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/maildir/maildir-storage.c	Mon Jun 22 17:45:56 2009 -0400
@@ -1056,7 +1056,8 @@ struct mailbox maildir_mailbox = {
 		index_transaction_set_max_modseq,
 		index_keywords_create,
 		index_keywords_create_from_indexes,
-		index_keywords_free,
+		index_keywords_ref,
+		index_keywords_unref,
 		index_keyword_is_valid,
 		index_storage_get_seq_range,
 		index_storage_get_uid_range,
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/maildir/maildir-sync-index.c
--- a/src/lib-storage/index/maildir/maildir-sync-index.c	Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/maildir/maildir-sync-index.c	Mon Jun 22 17:45:56 2009 -0400
@@ -326,7 +326,7 @@ maildir_sync_mail_keywords(struct maildi
 		kw = mail_index_keywords_create_from_indexes(mbox->ibox.index,
 							     &ctx->keywords);
 		mail_index_update_keywords(ctx->trans, seq, MODIFY_REPLACE, kw);
-		mail_index_keywords_free(&kw);
+		mail_index_keywords_unref(&kw);
 		return;
 	}
 
@@ -357,14 +357,14 @@ maildir_sync_mail_keywords(struct maildi
 		kw = mail_index_keywords_create_from_indexes(mbox->ibox.index,
 							     &ctx->idx_keywords);
 		mail_index_update_keywords(ctx->trans, seq, MODIFY_REMOVE, kw);
-		mail_index_keywords_free(&kw);
+		mail_index_keywords_unref(&kw);
 	}
 
 	if (array_count(&ctx->keywords) > 0) {
 		kw = mail_index_keywords_create_from_indexes(mbox->ibox.index,
 							     &ctx->keywords);
 		mail_index_update_keywords(ctx->trans, seq, MODIFY_ADD, kw);
-		mail_index_keywords_free(&kw);
+		mail_index_keywords_unref(&kw);
 	}
 }
 
@@ -464,7 +464,7 @@ int maildir_sync_index(struct maildir_in
 					mbox->ibox.index, &ctx->keywords);
 				mail_index_update_keywords(trans, seq,
 							   MODIFY_REPLACE, kw);
-				mail_index_keywords_free(&kw);
+				mail_index_keywords_unref(&kw);
 			}
 			continue;
 		}
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/mbox/mbox-storage.c
--- a/src/lib-storage/index/mbox/mbox-storage.c	Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/mbox/mbox-storage.c	Mon Jun 22 17:45:56 2009 -0400
@@ -872,7 +872,8 @@ struct mailbox mbox_mailbox = {
 		index_transaction_set_max_modseq,
 		index_keywords_create,
 		index_keywords_create_from_indexes,
-		index_keywords_free,
+		index_keywords_ref,
+		index_keywords_unref,
 		index_keyword_is_valid,
 		index_storage_get_seq_range,
 		index_storage_get_uid_range,
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/mbox/mbox-sync.c
--- a/src/lib-storage/index/mbox/mbox-sync.c	Mon Jun 22 01:44:42 2009 -0400


More information about the dovecot-cvs mailing list